类的生命周期

一.初识类的生命周期

类的生命周期分为加载,连接,初始化,使用,卸载五个阶段。

其中连接阶段又分为验证,准备,解析三个小阶段。

二.类的加载阶段

类的加载器通过类的全限定名通过不同渠道加载类的字节码信息到内存中,同时在方法区中创键instanceKlass对象,并将字节码信息保存到方法区。同时在堆区中创建java.lang.class对象保存类的方法和字段等信息。并将方法区和堆区建立关联。开发者直接访问堆区就好了

为什么还要使用堆区呢?直接访问方法区不行吗?

方法区基于c和c++实现,java无法直接访问,并且直接访问方法区可能篡改底层代码,造成安全问题。

三.类的连接阶段

1.验证

根据JVM虚拟机规范去验证字节码文件是否符合规范

2.准备

在堆区中为静态变量分配内存并赋值为0,常量直接赋值为固定值

为什么赋值为0呢?

变量中的内存可能没有进行垃圾回收,导致变量是垃圾值。

3.解析

将常量池中的符号引用解析为直接引用

所谓符号引用就是通过字符串编号等文字信息进行查找

而直接引用时通过内存地址进行查找

四.类的初始化阶段

类的初始化阶段会执行字节码文件中clinit方法的字节码指令完成类的初始化。

什么时候触发类的初始化呢?

1.访问静态变量或者静态方法。常量除外。

2.new对象

3.执行该类下的main方法

4.执行class.forName()方法

类之所以初始化都是因为需要用到该类了。

并且

子类完成初始化之前父类一定先初始化。

相关推荐
明天也要努力学习5 小时前
深入理解 JVM 垃圾回收(GC)
java·jvm
铁链鞭策大师5 小时前
jvm基础
jvm
香蕉大香蕉(06敬畏市场)1 天前
高频八股 · JVM(8)
java·jvm·面试·八股·大厂实习
北冥you鱼1 天前
Go 语言 GORM 使用 Preload:从关联查询到嵌套预加载的完整实践
开发语言·jvm·golang
兔头?1 天前
JVM学习文档
jvm·学习
wuminyu1 天前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
EVEN-09131 天前
Linux-线程控制
linux·jvm
刚入门的大一新生2 天前
Linux-线程概念
linux·jvm
eleven_4u2 天前
QPS如何计算,如何部署架构
java·linux·运维·jvm·中间件
qq_452396232 天前
第八篇:《VACUUM、自动清理与膨胀治理》
jvm·数据库·oracle