类加载过程
①加载:将外部的.class文件调入内存,在.class文件加载至方法区后,会在堆中创建一个java.lang.Class对象,对来封装类的信息,类加载的最终产物就是位于堆中的Class对象(注意不是目标类对象),该对象封装了类在方法区中的数据结构,并且向用户提供了访问方法区数据结构的接口,即Java反射的接口。
②将java类的二进制代码合并到JVM的运行状态之中的过程
验证:确保加载的类信息符合JVM规范,没有安全方面的问题
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
解析:虚拟机常量池的符号引用替换为字节引用过程
概念解释:
JVM中的直接引用和符号引用
符号引用:
官方:符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机的布局无关。
个人理解:在虚拟机编译java类为class文件,在编译时不知道引用类的地址,这个时候多以符号来代替。在JVM加载类的解析阶段将这个符号转化为实际的内存地址。
直接引用:
官方:直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译 出来的直接引用一般是不同的。如果有了直接引用,那么直接引用的目标一定被加载 到了内存中。
个人理解:1. 直接指向目标的指针(指向对象,类变量,类方法的指针)
2. 相对偏移量(指向实例的变量,方法的指针)
3. 一个间接定位到对象的句柄。
PS:偏移量:存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”
③初始化
这个阶段主要是对类变量初始化,是执行类构造器的过程。
换句话说,只对static修饰的变量或语句进行初始化。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
填写下面表单即可预约申请免费试听!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
一级建造师二级建造师消防工程师造价工程师土建职称房地产经纪人公路检测工程师建筑八大员注册建筑师二级造价师监理工程师咨询工程师房地产估价师 城乡规划师结构工程师岩土工程师安全工程师设备监理师环境影响评价土地登记代理公路造价师公路监理师化工工程师暖通工程师给排水工程师计量工程师
执业药师执业医师卫生资格考试卫生高级职称护士资格证初级护师主管护师住院医师临床执业医师临床助理医师中医执业医师中医助理医师中西医医师中西医助理口腔执业医师口腔助理医师公共卫生医师公卫助理医师实践技能内科主治医师外科主治医师中医内科主治儿科主治医师妇产科医师西药士/师中药士/师临床检验技师临床医学理论中医理论