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>()构造器,用于初始化成员变量


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

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

相关文章
|
4月前
|
前端开发 安全 Java
聊聊Java虚拟机(一)—— 类加载子系统
虚拟机就是一款用来执行虚拟计算机指令的计算机软件。它相当于一台虚拟计算机。大体上,虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机就相当于一台物理电脑,里面可以安装操作系统;程序虚拟机是为了执行单个计算机程序而设计出来的虚拟机。其中 Java 虚拟机就是**执行 Java 字节码指令的虚拟机**。
46 2
|
8月前
|
前端开发 安全 Java
JVM类加载和双亲委派机制
JVM类加载和双亲委派机制
108 0
|
29天前
|
存储 前端开发 安全
JVM内部世界(内存划分,类加载,垃圾回收)(上)
JVM内部世界(内存划分,类加载,垃圾回收)
55 0
|
3月前
|
安全 Java 程序员
深入理解jvm - 类加载过程
深入理解jvm - 类加载过程
51 0
|
5月前
|
存储 前端开发 安全
浅谈 JVM 类加载过程
浅谈 JVM 类加载过程
44 0
|
5月前
|
存储 安全 Java
JVM类加载(类加载过程、双亲委派模型)
JVM类加载(类加载过程、双亲委派模型)
|
6月前
|
存储 算法 安全
面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
58 0
|
8月前
|
安全 前端开发 Java
JVM概述和类加载子系统
我记得当年学java的时候,就很好奇,为什么我在IDEA上写一些代码(其实就是一堆我们人能知道的英文单词的组合加一些运算符),为什么就可以在windows上运行后执行我们的指令,而且还可以打成jar包去linux系统跑起来,为什么一份代码可以在不同平台运行呢?类是如何加载的?对象如何创建的以及都有哪些信息?我创建的对象被分配到哪个内存去了?java是怎么和我们操作系统打交道的又是怎么调用CPU为我们计算的?创建了对象分配了内存,为什么可以不用手动回收就可以自动清理内存等等等,相信你也同样有过这些困惑。
57 0
|
9月前
|
存储 安全 前端开发
【jvm系列-02】jvm的类加载子系统以及jclasslib的基本使用
【jvm系列-02】jvm的类加载子系统以及jclasslib的基本使用
55 0
|
10月前
|
存储 Java Linux
Java类加载过程、为什么会出现JVM?
也就是说Java程序可以在windows操作系统上运行,不做任何修改,同样的java程序可以在Linux操作系统上运行,跨平台。