多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

JVM-04-类的生命周期

JVM-04-类的生命周期 文章目录什么是类的生命周期1. 加载2. 连接2.1 验证2.2 准备2.3 解析3. 初始化类什么时候会初始化什么时候不会初始化总结什么是类的生命周期描述了一个 .class 文件从被 JVM 加载到卸载的整个过程。主要包含以下阶段加载loading连接linking验证准备解析初始化initialization使用suing卸载unloading与垃圾回收有关这里重点介绍加载、连接、初始化这三个阶段。1. 加载作用把 .class 文件加载到 JVM 中。类加载器根据类的全限定名通过不同的渠道以二进制的方式获取字节码信息。类加载器在加载完类后Java虚拟机会将字节码中的信息保存到内存的方法区中。生成InstanceKlass对象保存类的所有信息此外还包含一些特定信息比如多态用到的虚方法表。Java虚拟机还会再堆中生成一份与方法区中数据类似的Java.lang.Class对象。这样可以获取java代码中的类的信息及静态变量JDK 8及以后。注意InstanceKlass对象是c编写的jvm不能直接操作所以在堆上创建了用Java语言包装后的对象Java.lang.Class以能够在Java代码中获取。并且Java.lang.Class中的字段要少于InstanceKlass中的比如与多态有关的虚方法表对开发者来说不需要操作也为了安全考虑就没有。可以理解为InstanceKlassJVM 眼里的“类”java.lang.ClassJava 程序员能操作的“类对象”使用HSDB查看类加载阶段创建的对象和加载的信息。打开hsdb在jdk的bin目录下进入cmd然后输入jhsdb hsdb出现弹窗连接到某个java进程需要输入进程id可以通过jps命令找到对应的进程id。3. 查看整个虚拟机创建的对象显示了类名、大小、个数2. 连接分为三个阶段验证、准备、解析。2.1 验证检查 .class 文件是否符合 JVM 规范防止恶意字节码一般不需要程序员关注。会检查文件格式字节码是否合法类型是否正确2.2 准备会给static变量分配内存并设置初始值基本类型和引用类型都有初始值。举例publicclassTest{staticintcount100;}在准备阶段count的值为0而不是100等于100发生在类的初始化阶段。注意如果final修饰的基本类型的静态变量准备阶段会直接将代码中的值进行赋值也就是说如果是final static int count 100;在准备阶段count的值为100。2.3 解析将常量池中的符号引用也就是字节码中使用编号来访问常量池中的内容替换为直接引用。符号引用内存引用可以使用HSDB-Tools-Class Brower查看对应的类的信息可以看到地址值不再是符号引用。3. 初始化会执行静态代码块中的代码并为静态变量赋值。初始化阶段会执行字节码文件中clinit部分的字节码指令。注意clinit是类初始化init是对象初始化。init构造方法mainmain方法clinit初始化阶段执行clinit方法中的执行顺序与Java源码中的编写顺序一致。类什么时候会初始化new对象newUser();访问静态变量User.count;调用静态方法User.test();反射Class.forName(User);什么时候不会初始化User.class这个时候只会加载不一定初始化。总结如果一个静态变量由final修饰并且等号右边有值那么这个变量在准备阶段直接进行初始化。访问父类的静态变量不会触发子类的初始化子类的初始化clinit调用前会先调用父类的clinit方法。添加-XX:TraceClassLoading参数可以打印出加载并初始化的类。以上为个人学习分享如有问题欢迎指出
返回列表