classloader trace
类加载机制:
程序启动时,根据入口函数调用相关功能,功能在不同类中即在不同的class文件中,jvm根据类加载机制来动态加载class文件到内存中,只有被加载后才能被调用,否则引发异常
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作
应用加载一个类,首先委托给父家在第,然后从顶层的bootstrap classloader试图加载,如果没加载成功,则往下传递,直到最下层加载器去到指定文件系统或网络URL中去加载,都没有就ClassNotFoundException,否则将这个找到的类生成一个定义,并加载到内存,返回这个类在内存中的class实例对象
避免重复加载(确保只有一个加载),安全(不能自己写一个String加进去)
类相同 = 类名相同 + 加载该类的类加载器相同
BootStrap ClassLoader JDK核心类库加载(rt.jar/resource.jar/charset.jar等)C++编写,嵌入JVM内核,启动JVM时随之启动,负责加载核心类库并构造下面两种类加载器 "sun.boot.class.path"
Extension ClassLoader 加载扩展类(jre/lib/ext下的jar) "java.ext.dirs"
App ClassLoader 系统类加载器(应用下的jar和class) "java.class.path"
java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toExternalForm());
} System.out.println(System.getProperty("sun.boot.class.path"));
ClassLoader loader = TestClassLoaderIssue.class.getClassLoader();
while(loader != null) {
System.out.println(loader);
loader = loader.getParent();
}
System.out.println(loader);
sun.misc.Launcher$AppClassLoader@21ff3fcf
sun.misc.Launcher$ExtClassLoader@7cb64078
null
为什么要创建自己的类加载器管理类加载:
1. 因为 java提供的只能加载指定目录下的jar和class,其他位置或者网络无法方便加载
2. Class文件需要加密,先将classa进行加密,然后按照规则编写自定义的ClassLoader进行解密,这样我们就可以在程序中加载特定了类,并且这个类只能被我们自定义的加载器进行加载,提高了程序的安全性
3. 可以多版本共存,灵活
继承ClassLoader重写findClass,将class二进制流读入
1. 创建一个类, 编译后将class文件放在d:\com\timer\下
package com.timer;
/**
* Created by itworker365 on 5/16/2017.
*/
public class LoadedByClassFileClass {
public LoadedByClassFileClass(){
System.out.println("LoadedByClassFileClass loaded111 by class loader");
}
}
2. 创建一个类加载器,测试类加载
package com.timer;
import java.io.*;
/**
* Created by itworker365 on 5/16/2017.
*/
public class TestClassLoaderIssue extends ClassLoader{
private String path = "d://";
private final String fileType = ".class"; public TestClassLoaderIssue() {
super();
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] data = this.loadClassData(name);
return this.defineClass(name, data, 0, data.length);
}
private byte[] loadClassData(String name) {
InputStream in = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
try {
name = name.replace(".", "\\");
in = new BufferedInputStream(new FileInputStream(new File(path + name + fileType)));
baos = new ByteArrayOutputStream();
int ch = 0;
while (-1 != (ch = in.read())) {
baos.write(ch);
}
data = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return data;
}
public static void main(String[] args) {
TestClassLoaderIssue loader = new TestClassLoaderIssue();
Class<?> clazz = null;
Object object;
try {
clazz = loader.loadClass("com.timer.LoadedByClassFileClass");
object = clazz.newInstance();
System.out.println();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
加入jvm参数 -XX:+TraceClassLoading,可以看到类加载的具体情况
[Loaded sun.security.action.GetBooleanAction from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
[Loaded com.timer.LoadedByClassFileClass from __JVM_DefineClass__]
[Loaded java.net.InetAddress$Cache from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar]
查看jar中包含的类:jar -tvf slf4j-api-1.7.5.jar
classloader trace的更多相关文章
- Android -- java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
使用Bundle 的getParcelableArray 出现了以下错误: Class not found when unmarshallingjava.lang.ClassNotFoundExcep ...
- [Java Basics] Stack, Heap, Constructor, I/O, Immutable, ClassLoader
Good about Java: friendly syntax, memory management[GC can collect unreferenced memory resources], o ...
- Spark-HBase集成错误之 java.lang.NoClassDefFoundError: org/htrace/Trace
在进行Spark与HBase 集成的过程中遇到以下问题: java.lang.IllegalArgumentException: Error while instantiating 'org.apac ...
- 使用java动态字节码技术简单实现arthas的trace功能。
参考资料 ASM 系列详细教程 编译时,找不到asm依赖 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas ...
- 使用自定义 classloader 的正确姿势
详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ...
- Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new
Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new 1.1. 载入类的几种方法 Class.forName ClassLo ...
- HTTP Method详细解读(`GET` `HEAD` `POST` `OPTIONS` `PUT` `DELETE` `TRACE` `CONNECT`)
前言 HTTP Method的历史: HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这三个方法 HTTP 1.1 这个版本是当前版本,包含GET HE ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
- Class.forName和ClassLoader.loadClass等
Class类 首先,Class类里可以记载所有类的属性.方法等信息.这个也就是运行时类别标记,它记录了所有的对象(比如int,MyClass,void,数组等等)对应的类信息. Class对象 JVM ...
随机推荐
- [UE4]把枪打飞addImpulse
一.武器如果没有开启模拟物理,会漂浮在空中 二.武器开启模拟物理,运行游戏的时候就会掉到地上了.之所以要加“Delay”延迟,是因为创建武器在先(没有持有人),持有武器动作在后,加上“delay”延迟 ...
- CountDownLatch与join的区别和联系
首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...
- python类的全面介绍
转载:全面介绍python面向对象的编程——类的基础 转载:类的实例方法.静态方法.类方法的区别
- list函数
列表的切片: 获取: 1. [start:] 2. [:end] 3. [statr:end] 4. [statr: end: spet] 修改: listvar[:2] = ' 把0~1索引元素删除 ...
- (转)Java调用Weservice
原文地址:http://www.cnblogs.com/jiangxu1989/p/6491483.html https://www.cnblogs.com/neughj/p/5145630.html ...
- 【Unix网络编程】chapter5TCP回射服务器程序
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t ...
- windows模拟linux部分功能
--------------------------------------------分割线----------------------------------------------- 系统 wi ...
- SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)
/* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...
- day10学习笔记整理
函数对象函数是第一类对象: 指的是函数名指向的值(函数)可以被当作数据去使用 1. 可以被引用 2. 可以当作参数传给另外一个函数 3. 可以当作一个函数的返回值 4. 可以当作容器类型的元素 l ...
- linux进程端口防火墙
进程端口: 1.netstat –apn :查看所有的进程和端口使用情况 2.查看8080端口是否被占用 [root@localhost bin]# lsof -i:8080 3.查看防火墙开放的端口 ...