码迷,mamicode.com
首页 > 其他好文 > 详细

深入理解JVM之 ==> 类加载机制

时间:2020-04-22 00:21:35      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:mic   启动   图片   加载过程   image   机制   阶段   dha   hand   

一、类加载的生命周期

技术图片

  类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载总共 7 个阶段。其中,验证、准备、解析 3 个阶段统称为连接。 

  上图中,加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 语言的运行时邦栋。

二、类加载的时机

  什么情况下需要开始类加载过程的第一个阶段:加载?Java 虚拟机规范种并没有进行强制约束,但是对于初始化阶段,虚拟机规范则严格规定了有且只有 5 种情况必须立即对类进行“初始化”,而加载、验证、准备自然需要在初始化之前开始 。

  • 遇到 new(用new实例对象),getStatic(读取一个静态字段),putstatic(设置一个静态字段),invokeStatic(调用一个类的静态方法)这四条指令字节码命令时,类没有进行过初始化,则需要先触发其初始化(被 final 修饰、已在编译期把结果放入常量池的静态字段除外);
  • 使用Java.lang.reflect包的方法对类进行反射调用时,如果此时类没有进行过初始化,则需要先触发其初始化;
  • 当初始化一个类时,如果其父类没有进行初始化,则需要先触发其父类的初始化;
  • 当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类;
  • 当使用JDK1.7的动态语言支持的时候,如果一个 java.lang.invoke.MethodHandler 实例后的解析结果是 REF-getStatic/REF_putstatic/REF_invokeStatic 的方法句柄,并且这个方法句柄对应的类没初始化,则需要先触发其初始化;

三、类加载的过程

 

深入理解JVM之 ==> 类加载机制

标签:mic   启动   图片   加载过程   image   机制   阶段   dha   hand   

原文地址:https://www.cnblogs.com/L-Test/p/12741682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!