JVM类加载机制

类的生命周期

一个类被加载到内存到拆卸出内存为止,它的整个生命周期包括7个阶段:加载–>验证–>准备–>解析–>初始化–>使用–>拆卸。其中验证、准备和解析3个阶段称为连接(Linking)。

类的加载时机

什么时候触发类的加载?其实JVM规范并没有严格规定类加载的时机,而是由具体的虚拟机实现自由把我时机。但是虚拟机规范严格规定了有且只有5中情况必须立即对类进行“初始化”(加载、验证、准备自然在此之前)。

  • 遇到new,getstatic,putstatic或invokestatic这4条字节码指令时,如果类没有被初始化,则需要触发其初始化。这4条指令对应的场景就是使用new创建一个对象时,获取类静态变量时,设置类的静态变量时,调用类的静态方法时。
  • 使用反射对类的进行调用时。
  • 当初始化一个类时,如果其父类还未初始化则先初始化父类。
  • 当虚拟机启动时,自动初始化主类(就是包含main方法的类)。
  • 当使用JDK1.7的动态语言时,如果一个java.lang.invoke.Methodhandle实例最后解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,如果这个方法句柄对应的类没有初始化,则需要进行初始化。

这5中场景称为对类的主动引用,换句话说当对类进行主动引用时就会触发类的初始化,除此之后其他对类的引用方式都不会触发类的初始化,称为被动引用。

例如下面就是对类一个被动引用的例子:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloud-Future

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值