类加载流程1.7(基于HotSpot)
2016-11-10 09:42:55 0 举报
类加载流程是Java虚拟机将类的字节码文件加载到内存中,并对字节码进行验证、准备和解析的过程。在Java 7(基于HotSpot)中,类加载流程主要包括以下步骤:加载、验证、准备、解析和初始化。首先,通过类名查找对应的字节码文件,然后使用自定义的类加载器将字节码文件加载到内存中。接下来,对字节码进行验证,确保其符合Java规范。然后,为类分配内存并设置初始值。接着,解析字节码,将符号引用转换为直接引用。最后,对类进行初始化,执行静态代码块和静态变量赋值。
作者其他创作
大纲/内容
1
验证(Verification)
动态生成
注释
为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)
连接(Linking)
类变量(被static修饰的变量)分配内存并设置类变量初始值的阶段,数值变量在准备阶段过后的初始值为零值.变量赋值的putstatic指令是程序被编译后,存放于类构造器()方法之中。“特殊情况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,只有基础类型和字符串有该属性。会在准备阶段初始化为指定的值,这里是只要final修饰就好还是需要static和final一起修饰,当然是一起的时候。只是final在初始化的时候赋值?
解析(Resolution)
卸载(Unloading)
准备(Perparartion)
Class文件等等
具体流程
初始化(Initialization)
加载(Loading)
数据库
网络
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。直接引用:对于指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的本地指针。指向实例变量、实例方法的直接引用都是偏移量。实例变量的直接引用可能是从对象的映像开始算起到这个实例变量位置的偏移量。实例方法的直接引用可能是方法表的偏移量。符号引用:一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。
2
使用(Using)
加载阶段和连接阶段(Linking)的部分内容(如一部分字节码文件格式验证动作)是交叉进行的(思考什么时候会进行加载)
根据一个类的全限定名获取二进制字节流(静态储存结构)
内存中(堆?)生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
1.文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以魔术0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。 2.元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。 3.字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。 4.符号引用验证:确保解析动作能正确执行。 可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间
根据解析的时间点不同
静态储存结构转换成方法区的运行时数据结构
0 条评论
回复 删除
下一页