1. JVM类加载机制图解
下面我们来详细分析一下这个图解
1.1 其中loadClass()方法的调用的类加载的过程有如下几步
加载->验证->准备->解析->初始化->使用->卸载
- 加载:在硬盘上查找并通过IO读入字节码文件,当使用到这类的时候才会加载,也就是要有静态方法,main()方法的时候,或者new对象等等,会在加载阶段中生成一个代表这个类的Class对象(也就是实例),作为方法区这个类的各种数据的访问入库
- 校验:验证字节码文件的正确性
- 解析:将符号引用替换为直接引用,该阶段会把一些静态方法,main方法替换为指向数据所存内存的指针或者句柄等等,这就是所谓的静态链接过程(在类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用
- 初始化:对类的静态变量初始化为指定的值,并且执行静态代码
动态链接,静态链接就是把字面量换成对应的地址,只不过一个是在初始化的时候,另一个是在运行的时候
2.类加载器源码剖析,他为什么是这样的,为什么是上面那副图解
2.1 首先默认通过c++启动了Launcher类,让我们来看看为什么它能够创建ext类加载器和app类加载器
- 首先默认创建了Launcher类,并且调用了Launcher的初始化方法
这就是为什么创建了类加载器的原因,那么下一步我们看看调用的两个方法做了什么操作
这里还有一些细节就不在描述了,读者可以自己去看看,位置就这里,并且这里说明了为什么app的类加载器的parent属性是ext类加载器