文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JDK15类的后半生:准备、解析、初始化、卸载过程详解

2024-12-03 12:25

关注
[[379160]]

 

准备

两个目标:


案例

  1. public static final int value = 123; 

准备阶段后 value 的值为 0,而非 123,初始化后才为 123。

但若是被final修饰,若有初始值,则在编译阶段就会将初始值存入constantValue属性中,在准备阶段就将constantValue的值赋给该字段(此处将value赋为123)。

解析

把常量池中的符号引用转换成直接引用。

一组无歧义的符号来描述所引用的目标,与JVM的实现无关

直接指向目标的指针、相对偏移量、或是能间接定位到目标的句柄,和JVM实现相关

主要针对:类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符。

初始化

真正开始执行类中定义的Java程序代码(或是字节码)。

类的初始化就是为类的static变量赋初始值,初始化阶段就是执行类构造器的过程。

若是接口

调用Classloader类的loadClass方法来装载一个类,并不会初始化这个类,不属于对类的主动使用

clinit()方法由编译器自动产生,收集类中static代码块中的类变量赋值语句和类中static变量的赋值语句:

在准备阶段,类中static变量已完成默认初始化

而在初始化阶段,clinit()方法对static变量进行显式初始化

类的初始化时机

Java程序对类的使用方式分为:

JVM必须在每个类或接口“首次主动使用”时才初始化它们,被动使用类不会导致类的初始化。

主动使用的场景

FAQ

  1. public class Test { 
  2.     static { 
  3.         i = 0; 
  4.         System.out.println(i); //编译失败:"非法向前引用" 
  5.     } 
  6.     static int i = 1; 

其他线程虽会被阻塞,只要有一个clinit()方法执行完,其它线程唤醒后不会再进入clinit()方法。同一个类加载器下,一个类型只会初始化一次。

类的卸载

当代表一个类的Class对象不再被引用,那么Class对象的生命周期就结束了,对应的在方法区中的数据也会被卸载。Jvm自带的类加载器装载的类,是不会卸载的,由用户自定义的类加载器加载的类是可以卸载的。

 

来源:JavaEdge内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯