加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

五年 该知道JVM加载机制了!

发布时间:2021-04-06 16:02:36 所属栏目:外闻 来源:互联网
导读:ava虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不同,在Java语言里,类型的加载,连接和初始化过程都是在程序 运行期间完

ava虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程

和那些编译时需要连接工作的语言不同,在Java语言里,类型的加载,连接和初始化过程都是在程序 运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为java应用程序提供比较高的灵活性。

当我们使用到某个类的时候,如果这个类还未从磁盘上加载到内存中,JVM就会通过三步走策略(加载、连接、初始化)来对这个类进行初始化,JVM完成这三个步骤的名称,就叫做类加载或者类初始化

加载的时机

什么情况下需要开始类加载的第一个阶段——加载 ,在Java虚拟机规范中没有进行强制约束,而是交给虚拟机的具体实现来进行把握,但是对于初始化阶段,虚拟机规范严格规定了 “有且只有” 五种情况必须立即对类进行初始化(而加载、验证、准备自然需要在此之前开始),具体情况如下所示:

class文件的加载时机:于序号1的详细解释:

  1. 使用 new 关键字实例化对象时
  2. 读取类的静态变量时(被 final修饰,已在编译期把结果放入常量池的静态字段除外)
  3. 设置类的静态变量时
  4. 调用一个类的静态方法时

注意: newarray指令触发的只是数组类型本身的初始化,而不会导致其相关类型的初始化,比如, newString[]只会直接触发 String[]类的初始化,也就是触发对类 [Ljava.lang.String的初始化,而直接不会触发 String类的初始化。

生成这四条指令最常见的Java代码场景是:

对于这5种会触发类进行初始化的场景,虚拟机规范中使用了一个很强烈的限定语:“有且只有”,这5种场景中的行为称为对一个类进行主动引用。除此之外,所有引用类的方式都不会触发初始化,称为 被动引用。

需要特别指出的是,类的实例化和类的初始化是两个完全不同的概念:

  • 类的实例化是指创建一个类的实例(对象)的过程;
  • 类的初始化是指为类各个成员赋初始值的过程,是类生命周期中的一个阶段;

被动引用的三个场景:

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读