首页 > 其他分享 >类加载的时机

类加载的时机

时间:2022-09-03 15:48:39浏览次数:72  
标签:初始化 Java 虚拟机 阶段 时机 REF 加载

一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。

 

 

 

加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑定)。请注意,这里是按部就班地“开始”,而不是按部就班地“进行”或按部就班地“完成”,强调这点是因为这些阶段通常都是互相交叉地混合进行的,会在一个阶段执行的过程中调用、激活另一个阶段。关于在什么情况下需要开始类加载过程的第一个阶段“加载”,《Java虚拟机规范》中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,《Java虚拟机规范》则是严格规定了有且只有六种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):


1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有:

- 使用new关键字实例化对象的时候。
- 读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候。
- 调用一个类型的静态方法的时候。
2)使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需要先触发其初始化。
3)当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
5)当使用JDK 7新加入的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。
6)当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

标签:初始化,Java,虚拟机,阶段,时机,REF,加载
From: https://www.cnblogs.com/xu-xiaofeng/p/16652756.html

相关文章

  • 关于pycharm打开时很卡,一直加载中的解决办法~
    相信很多刚开始使用pycharm不太熟练的小伙伴,每天一开机打开pycharm总是卡半天,不知道的还以为是电脑卡了或者啥问题的。莫慌,其实并不是…今天我们就来解决一下这个问......
  • 解决el-table数据量过大(上万条)加载页面直接卡死的问题(及复选框选择卡顿问题)
    1:安装npminstallumy-ui2:引用import{UTable,UTableColumn}from'umy-ui';importAppfrom'./App.vue';Vue.component(UTable.name,UTable);Vue.compon......
  • 面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
    一、JVM内存结构▷谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期、数据共享;是否GC、是否OOM答:jvm内存结构包括程序计数器、虚拟机栈、本地方法栈、堆、方......
  • Java 类的加载顺序
    一、概述一个Java类在编译器中是如何加载的,它的各个成员的加载顺序又是什么?这些成员涉及到静态成员变量、静态代码块、构造代码块、构造方法、成员变量、成员方法......
  • FairyGUI窗口拖动,关闭,加载图片
    1.在FairyGUI软件里面制作好窗口window的格式,按照官网上的来关闭按钮:closeButton、拖动范围:dragArea、步骤:1.新建一个空组件2.再建一个空组件命名为:frame3.frame组件......
  • 类加载的机制及过程
    5个步骤:加载-->验证-->准备-->解析-->初始化加载:读取二进制文件,根据路径找到对应的class文件然后导入检查:检查对应的class文件的正确性准备:给类中的静态变量分配内......
  • MyBatis-分步查询的优势(延迟加载)
    分步查询的优点:可以实现延迟加载  但是必须在核心配置文件中设置全局配置信息(mybatis-config.xml):lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延......
  • dhtmlx中的grid加载不了数据
    我是一个初学者,求大神帮我看下这data为什么加载不了<scripttype="text/javascript">vardata={rows:[{"id":"1",data:["烟雾测试","金华尾气检测站","423cvhjj","1233676......
  • d3.js 分页加载
    当数据量过大时,使用d3.js渲染各种图时,如果一下子加载出来,会出现加载过慢,这样使用效果就不是太好,为了解决这个问题,使用了分页加载数据并渐进渲染各种图。一、数据格式......
  • PreloadJS预加载插件
     一个Javascript插件,可以管理和协调资源的加载进度。 CDN地址:https://cdn.baomitu.com/PreloadJS //实例LoadQueue类,得到实例对象queue。letqueue=new......