JVM类加载时机

简介: JVM类加载时机

正文


平时的工作中,一般都是编写代码。我们都知道编写的.java文件会编译成.class文件,之后供给JRE或者JDK运行程序。但是,一个类型加载到使用最终的卸载。那.class文件什么时候加载到JVM中提供给我们使用呢?


大家都知道,一个类型的使用经历七个阶段:加载、验证、准备、解析、初始化、使用以及卸载这7个阶段。其中验证、准备、解析这3个阶段也是链接的部分。下面简单的介绍何时加载?


  1. 当程序遇到new、getstatic、putstatic或者invokestatic这四条字节码指令的时候,如果类型没有进行初始化过,则先触发其初始化的阶段。
  2. 使用反射的时候,如果类型没有进行初始化过,则需要先触发初始化的阶段。
  3. 当初初始化类型的时候,如果发现其父类没有初始化过,则需要先触发父类的初始化。
  4. 当虚拟机启动的时候,用户需要执行一个主类(包含有main方法),虚拟机先会初始化这个主类。
  5. 当使用JDK7 的时候,新加入的语言支持使,如果一个java.lang.invoke.MethodHandle实例最后解析REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄的时候,并且这个方法句柄没有进行初始化过,则需要先进行初始化。
  6. 当一个接口定义了JDK8新加入的默认方法(被default修饰的方法),如果有这个接口的实现类发生初始化的时候,那该接口要在其之前进行初始化。

对于上面6中的方式初始化,《Java虚拟机规范》中使用了一个非常强烈的限定语--有且仅有,这六种场景称之为对于一个类的主动引用。除此之外,其他的引用都不会对该类进行初始化,成为被动引用


接口是一个特殊的类,接口加载过程与类加载过程有所不同。针对接口需要做一些特殊的说明,接口也是有初始化的过程的,这一点是与类是一致的。由于接口里面不能使用static{}这这种静态代码块,但是编译器仍然会给接口生成<clinit>()构造器,用于初始化成员变量


注意:类与接口的最大的不同点是:

类的初始会自动的初始化他的父类,然而接口不会自动的初始化他的父类,仅仅使用的时候才会进行初始化这个类型。

相关文章
|
2月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
65 3
|
3月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
125 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
4月前
|
存储 算法 Java
JVM组成结构详解:类加载、运行时数据区、执行引擎与垃圾收集器的协同工作
【8月更文挑战第25天】Java虚拟机(JVM)是Java平台的核心,它使Java程序能在任何支持JVM的平台上运行。JVM包含复杂的结构,如类加载子系统、运行时数据区、执行引擎、本地库接口和垃圾收集器。例如,当运行含有第三方库的程序时,类加载子系统会加载必要的.class文件;运行时数据区管理程序数据,如对象实例存储在堆中;执行引擎执行字节码;本地库接口允许Java调用本地应用程序;垃圾收集器则负责清理不再使用的对象,防止内存泄漏。这些组件协同工作,确保了Java程序的高效运行。
34 3
|
4月前
|
C# UED 开发者
WPF动画大揭秘:掌握动画技巧,让你的界面动起来,告别枯燥与乏味!
【8月更文挑战第31天】在WPF应用开发中,动画能显著提升用户体验,使其更加生动有趣。本文将介绍WPF动画的基础知识和实现方法,包括平移、缩放、旋转等常见类型,并通过示例代码展示如何使用`DoubleAnimation`创建平移动画。此外,还将介绍动画触发器的使用,帮助开发者更好地控制动画效果,提升应用的吸引力。
230 0
|
5月前
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。
102 0
|
5月前
|
Java Perl
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
|
5月前
|
存储 安全 Java
开发与运维引用问题之JVM类加载过程如何解决
开发与运维引用问题之JVM类加载过程如何解决
34 0
|
5月前
|
存储 算法 Java
JAVA程序运行问题之Java类加载到JVM中加载类时,实际上加载的是什么如何解决
JAVA程序运行问题之Java类加载到JVM中加载类时,实际上加载的是什么如何解决
|
6月前
|
安全 前端开发 Java
《JVM由浅入深学习【一】 》JVM由简入深学习提升(类加载过程+父子类加载过程+类加载器+双亲委派机制)
《JVM由浅入深学习【一】 》JVM由简入深学习提升(类加载过程+父子类加载过程+类加载器+双亲委派机制)
45 0
|
6月前
|
存储 安全 前端开发
JVM(二)-类加载子系统
JVM(二)-类加载子系统
27 0