Jvm类加载过程
2021-11-14 16:20:56 0 举报
Jvm类加载过程
作者其他创作
大纲/内容
堆内存HelloWord.class对象(一个类有且只有一个)
Java栈(VM Stack)
javac
准备(preparation)
JVM
加载loading
主要验证字节流是否符合Class文件格式规范,并且能被当前的虚拟机加载处理。元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求。字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。符号引用验证:确保解析动作能正确执行。
初始化阶段就是为类的静态变量依次赋予实际的初始值(注意与前面的默认值区分开,这里指的是赋予代码中的值),包括静态代码块也会执行。这个阶段,会执行类的构造函数,并且JVM也负责对类成员变量进行初始化赋值
HelloWord.java{public staic int a = 1}
类准备阶段负责为类的静态变量分配内存,并设置默认初始值,注意是虚拟机给各个类型的变量定义的默认值,不是实际程序中的赋值。public staic int a = 1;准备阶段a的值为默认值0,而不是1对于基本类型的静态变量一般被赋予0,对于引用的静态类型,一般被赋予null,如果是boolean型数据,则为false,对于final修饰的变量,会在这个阶段就直接赋值,成员变量则不会赋初始值
加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。 类加载阶段:(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。(2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。(3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
解析(resolution)
链接(linking)
程序计数器(Program Counter Register)
jvm从本地磁盘找出helloWord的class文件,加载到内存
验证(verification)
Jvm类加载过程
Text
初始化(initialization)
堆(HEAP)
把类中的符号引用转化为直接引用。当一个Java类被编译成Class之后,假如这个类称为A,并且A中引用了B,那么在编译阶段A是不知道B有没有被编译的,而且此时B也一定没有被加载,所以A 肯定不知道B的实际地址,那么此时在A的class文件中,将使用一个字符串S来代表B的地址,S就被称为符号引用,在运行时,如果A发生了类加载到了解析阶段会发现B还未被加载,那么将会触发B的类加载,将B加载到虚拟机中,此时A中B的符号引用将会被替换为B的实际地址,这被称为直接引用。这样也能真正的调用B了。
方法区class对象的数据结构,常量池,成员变量,方法,类信息等等
方法区(Method Area)
HelloWord.class
本地方法栈(Native Method Stack)
HelloWord aa =new HelloWord()
运行是数据区(Runtime Data Area)
0 条评论
下一页