JVM内核-原理、诊断与优化学习笔记(五):类装载器

版权声明:本文为作者原创,转载请注明出处,联系qq:32248827 https://blog.csdn.net/dataiyangu/article/details/88049052

class装载验证流程

class装载验证流程

加载
链接(验证、准备、解析)
初始化

class装载验证流程 -加载

装载类的第一个阶段
取得类的二进制流
转为方法区数据结构
在Java堆中生成对应的java.lang.Class对象

class装载验证流程 -链接 验证

链接 -> 验证

目的:保证Class流的格式是正确的

文件格式的验证

是否以0xCAFEBABE开头
版本号是否合理

元数据验证(class文件简单语义的验证)

是否有父类(比如某个类继承了某个类,可是这个类根本就是不存在的。)
继承了final类?(继承了final的方法或者修改了final属性)
非抽象类实现了所有的抽象方法(非抽象类实现接口中所有的非抽象方法)

字节码验证 (很复杂)

运行检查
栈数据类型和操作码数据参数吻合(分配了两个字的空间,可是运行的时候可能不只是两个字、分配了两个局部变量,可是运行的时候发现很多的局部变量)
跳转指令指定到合理的位置(跳转至零跳转到字节码的一个偏移量上面,比如本来就五十个字节,结果跳转到第五十一个字节上去了。)

符号引用验证

常量池中描述类是否存在(比如一个类继承了某个类,可是这个接口或者类实际上是不存在。)
访问的方法或字段是否存在且有足够的权限(访问的方法或者字段的权限是否足够(public private等))

class装载验证流程 -链接 准备

链接 -> 准备

分配内存,并为类设置初始值 (方法区中)

public static int v=1;
在准备阶段中,v会被设置为0
在初始化的中才会被设置为1
对于static final类型,在准备阶段就会被赋上正确的值
public static final int v=1;

class装载验证流程 -链接 解析

链接 -> 解析

符号引用替换为直接引用

符号引用就是字符串,默认的超类就是java.lang.Object,符号引用就是在常亮池里面有个字符串,字符串的内容就是java.lang.Object,符号引用并不能被用,只是一种表示的方式,直接就是指针或者地址偏移量,因为最后一定是指向一个内存地址,替换为直接引用之后,class才能够用自己需要引用的内容。

符号引用:字符串引用对象不一定被加载
直接引用:指针或者地址偏移量引用对象一定在内存

什么是类装载器ClassLoader

JDK中ClassLoader默认设计模式

打破常规模式

热替换

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/88049052