5分钟掌握jvm 类的加载机制


类的加载分为以下几个阶段

加载->验证->准备->解析->初始化->使用->卸载

           |         链接阶段     |

           ------------------------

速记法:家宴准备,姐使用蟹

1. 加载,在虚拟机方法区中生成一个这个类的对象,作为方法区中这个类各种信息的访问入口,这个加载文件的来源可以是本地某个目录,war包,或者是网络来源,或者是运行时生成的类的信息。


2.验证,验证阶段主要是验证文件类型是否符合虚拟机的要求,是否合法,是否会损害虚拟机的安全,验证虽然重要,但不是必须的。可以通过Xverifynone参数关闭大部分验证。

验证主要验证一下几个部分:1.文件格式验证,魔术是否为0xCAFEBABE开头,版本号是否在当前虚拟机可运行范围内,常量池中是否有不支持的类型。
 2.元数据验证,分析语义是否符合java规范。
 3.字节码验证,验证语义是否合法符合逻辑。
 4.引用符号验证,保证解析能够正确执行。
  速记法,服(符号)侍(格式)源(元数据)码(字节码)
3. 准备,准备阶段会给类的静态变量分配内存(方法区中),并设置初始值,需要注意的是这时候的初始值并不是在代码里赋值的初始值,而是规定的零值,例如,static int a=1,在这个阶段并不是赋值为1,而是赋值为0,赋值为1的操作是在后边类的初始化阶段才会做的,但是final类型的会在此阶段旧赋值为给定值,例如 static final a=1,这个a变量在此阶段已经是1。

4. 解析,解析阶段是将常量池中的符号引用替换为直接引用的过程,针对类或接口,字段,方法,接口方法,方法类型,方法句柄,和调用点限定符进行引用。


5.初始化,初始化是真正执行源码中编写的static 变量赋值语句的过程,初始化会执行类的构造器方法<clinit>()方法,类的构造器方法是由编译器自动收集类中所有static变量和static语句块中的语句合并产生的,顺序是按源码中出现的先后顺序,因此静态语句块无法访问定义在其后边的静态变量。

虚拟机会保证在子对象的初始化方法执行之前父类的类构造器方法会自动执行,不用显示的调用,同时虚拟机可以保证多个线程同时加载一个类,只有一个线程能够执行类的构造方法。
虚拟机规定只有5中情况必须对类进行初始化,
1.遇到 new getstatic,putstatic,invokestatic这四条指令,如果类还没有初始化,要对类进行初始化,这四条指令对应的java代码通常是,new关键字实例化对象,读取或设               置一个类的静态属性,以及调用一个类的静态方法时。
2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没进行过初始化要先初始化。
3.当初始化一个类的时候,如果其父类还没有初始化,要对其初始化。
4.当启动虚拟机时,要执行的main方法所在的类要初始化。
5.当使用动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后解析的结果是REF_getstatic,REF_putstatic,invokeStatic的方法句柄,并且这个方法句柄对应             的类没有进行过初始化,则要出发初始化。
速记法:嘱(主main)咐(父类)反(反射)动(动态语言时)得死(四条指令) 嘱咐反动得死
以上五种都是主动引用,除了主动引用被动引用是不会出发类的初始化的,被动引用包含
1.通过子类引用父类的静态属性,子类不会出发初始化。
2.通过数组来引用类不会触发类的初始化。
3.引用类的静态常量,final static 修饰的变量不会触发类的初始化

速记法:常(常量)叔(数组)父(父类) 常叔父

更多精彩内容请关注微信公众号 IT农厂【ITFF01】




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值