JVM类加载的时机

server/2024/10/18 14:16:15/

Java虚拟机(JVM)的类加载机制是Java语言运行时的核心组成部分。它负责将Java类的描述信息从Class文件加载到内存中,并进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类加载的时机是指触发类加载器去加载一个类到内存中的具体条件。本文将详细介绍JVM类加载的时机。

一、主动引用的触发条件

在JVM中,当程序首次主动使用一个类时,会触发该类的加载和初始化。主动引用的触发条件包括以下几种情况:

  1. 创建类的实例
    当使用new关键字创建类的新实例时,如果该类尚未被加载和初始化,则会触发类加载过程。

  2. 访问类的静态变量或对其进行赋值
    当访问类的静态变量(除了被final修饰并已在编译期赋值的常量外),或者对静态变量进行赋值时,会触发类的加载和初始化。

  3. 调用类的静态方法
    当调用类的静态方法时,同样会触发类的加载和初始化。

  4. 使用反射
    当使用java.lang.reflect包中的方法对类进行反射调用时,如Class.forName()Constructor.newInstance()等,如果类还没有被加载和初始化,则会先触发其加载和初始化。

  5. 初始化子类
    当初始化一个子类时,如果其父类还没有被初始化,则会先触发父类的加载和初始化。

  6. JVM启动时的主类
    JVM启动时,会初始化包含main()方法的那个主类。

  7. 动态代理和动态类型语言支持
    在使用动态代理或JDK 1.7及以后版本引入的动态类型语言支持时,可能会触发相关类的加载和初始化。例如,当一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic等类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化时,需要先触发其加载和初始化。

  8. 接口中的默认方法
    当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

二、被动引用的非触发条件

除了上述主动引用的触发条件外,其他引用都不会触发类的加载和初始化,这些被称为被动引用。以下是一些被动引用的例子:

  1. 通过子类的引用访问父类的静态变量
    这种情况下,只会触发父类的加载和初始化,而不会触发子类的加载和初始化。

  2. 通过数组定义引用类
    仅仅通过定义数组来引用类,并不会触发该类的加载和初始化。例如,Parent[] array = new Parent[10]; 这行代码不会触发Parent类的加载和初始化。

  3. 访问类中final修饰的静态常量
    如果常量在编译期间已经存入常量池,那么访问这个常量本质上并没有直接引用到定义该常量的类,因此不会触发该类的加载和初始化。

三、类加载的完整过程

需要注意的是,类加载的完整过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。其中,加载、验证、准备三个阶段通常是在初始化之前完成的,并且是由类加载器按照双亲委派模型进行的。类加载机制遵循“懒加载”原则,即只有在真正需要的时候才会加载相应的类。

四、总结

JVM类加载的时机是Java语言运行时的重要特性之一。了解类加载的时机有助于深入理解Java程序的执行过程,并优化程序的性能。在实际开发中,可以根据业务需求和性能要求来选择合适的类加载策略,以实现更高效、更灵活的程序运行。


http://www.ppmy.cn/server/128044.html

相关文章

Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影

针对Win10鼠标频繁自动失去焦点的问题,可以尝试以下解决方案: 一、修改注册表(最有效的方法-重启之后立竿见影) 打开注册表编辑器: 按下WindowsR组合键,打开运行窗口。在运行窗口中输入“regedit”&#x…

Win10照片查看器不见了怎么办?

刚换了电脑,发现查看图片默认打开是window画图工具,看图竟然需要一张一张打开,超级不方便。右键图片选择打开方式也不见照片查看器,window自带的看图工具去哪儿了? 不要着急,我们可以把它找回来&#xff0…

Qt QWidget控件

目录 一、概述 二、Qwidget常用属性及函数介绍 2.1 enable 2.2 geometry 2.3 windowTitle 2.4 windowIcon 2.5 cursor 2.6 font 设置字体样式 2.7 toolTip 2.8 focusPolicy焦点策略 2.9 styleSheet 一、概述 widget翻译而来就是小控件,小部件。…

多线程编程-定时器

定时器相当于一个“闹钟”,在日常生活中,我们需要闹钟的辅佐,在代码中,也经常需要“闹钟”机制(网络通信中经常需设定一个超时时间)。 一.定时器的使用 在Java标准库中,也停供了定时器的实现。…

反调试—1

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…

组会汇报参考模板

学号_姓名_主题 📌摘要 主要概括汇报近一周各方面进展. 🗝 论文方面: … 🗝 实验方面: … 🗝 生活方面: … 🗝 其它: … 📚 论文方面 如果读了 背景 … 近些年进展与面临的问题 … 本文的动机与做…

第五节——转移表(让你不再害怕指针)

文章目录 制作简易计算器什么是转移表?switch函数实现函数指针数组实现 制作简易计算器 要求:制作一个简易计算器,可以进行* / - 等功能运算。 什么是转移表? 指的就是通过函数指针数组的方式通过数组去调用里面的函数&#x…

酒店生态发展旅游四个一体化建设-—未来之窗行业应用跨平台架构

一、酒店在旅游中的作用 首先,酒店为游客提供了舒适的住宿环境。经过一天的游玩,游客需要一个干净、安全、设施齐全的空间休息,恢复精力,以更好地继续后续的行程。 其次,酒店是旅游服务的重要载体。它不仅提供住宿&am…