Initialization in《The Java® Virtual Machine Specification Java SE 7 Edition》
类(如果无特殊说明,本文中的“类”表示类和接口,下同)的初始化主要包括初始化的同步及执行其初始化方法<clinit>。
在以下几种情况下会触发类的初始化:
(1)执行JVM指令:new、getstatic、putstatic、invokestatic,会触发指令后的引用所指向类的初始化(若未初始化),即在java代码中体现为new一个对象,访问一个类的静态属性或静态方法;
(2)第一次调用2(REF_getStatic)、4(REF_putStatic)、6(REF_invokeStatic)类型的解析后的java.lang.invoke.MethodHandle实例,即在java代码中体现为访问一个类的静态属性或静态方法;
(3)调用某些反射方法,例如调用java.lang.Class类或调用java.lang.reflect包中的反射方法;
(4)子类的初始化会触发当前类的初始化;
(5)作为JVM启动的初始类(initial class)。
从线程角度,JVM是基于多线程设计的。所以对一个类的初始化也要考虑到初始化的同步问题。经过类的验证(Verification)和准备(Preparation)后的Class对象会处于以下几种初始化状态:
(1)该Class对象已经验证和准备,但还未初始化;
(2)该Class对象正在某一个线程中进行初始化;
(3)该Class对象已经初始化成功,处于待用状态;
(4)该Class对象处于初始化异常状态,可能之前已经尝试过初始化,但未成功。
任何一个类C都有唯一的初始化锁,假设为LC,假设有多个线程可能会进行类C的初始化,则类C的初始化过程如下(以下过程是从当前线程的角度来描述的):
(1)当前线程与多个线程竞争LC,当前线程等待直到获取到LC;
(2)若类C的Class对象表示其他的某一个线程T1正在进行类C的初始化,则当前线程释放LC,当前线程阻塞直到通知类C的初始化已经完成;
(3)若类C的Class对象表示当前线程正在进行类C的初始化,这一定是初始化的一个递归请求,则当前线程释放LC,初始化正常完成;
(4)若类C的Class对象表示类C处于已初始化状态,则当前线程释放LC,初始化正常完成;
(5)若类C的Class对象表示类C处于初始化异常状态,则停止初始化,当前线程释放LC,抛出NoClassDefFoundError异常;
(6)否则,记录当前线程正在进行类C的初始化,当前线程释放LC,然后按照ClassFile结构中的顺序,用静态常量ConstantValue属性中的值初始化静态常量(final static);
(7)若类C为class,有superclass SC,且SC还未初始化,则按照(1)—(6)递归对superclass进行初始化。若SC初始化异常,当前线程获取LC,标记类C的Class对象为初始化异常状态,通知其他等待线程,然后释放LC,抛出SC出现的异常,异常结束初始化;
(8)JVM通过询问类C的“the defining loader”,确定类C是否满足执行初始化方法<clinit>所需要的要求;
(9)执行类C的初始化方法<clinit>;
(10)若执行<clinit>成功,则当前线程获取LC,标记类C的Class对象为已初始化状态,通知其他等待线程,然后释放LC,初始化成功完成;
(11)若执行<clinit>抛出异常,假设异常为E:如果E不为Error类型,则创建ExceptionInInitializerError异常,E作为其参数,用创建的ExceptionInInitializerError异常进行后续操作;如果ExceptionInInitializerError因为OutOfMemoryError而创建失败,则用OutOfMemoryError异常进行后续的操作;
(12)获取LC,标记类C的Class对象为初始化异常状态,通知其他等待线程,然后释放LC,抛出上一步出现的异常,完成初始化过程。
附上官方《The Java® Virtual Machine Specification Java SE 7 Edition》链接:https://docs.oracle.com/javase/specs/jvms/se7/html/index.html。
Initialization in《The Java® Virtual Machine Specification Java SE 7 Edition》相关推荐
- java virtual的作用_JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚
存储交换根据传递信息单位的大小可分为() 请简要回答1951年<幼儿园暂行规程>和<幼儿园暂行教学纲要>所规定的幼儿园的教养原则. 下列哪种下载方式不需要服务器?() 技能考核 ...
- [The Java8 Virtual Machine Specification述]Chapter2
Chapter 2. The Structure of the Java Virtual Machine This document specifies an abstract machine. It ...
- eclipse failed to create the java virtual machine 问题图文解析
eclipse failed to create the java virtual machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ec ...
- ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
ubuntu linux下解决"no java virtual machine was found after searching the following locations:" ...
- Eclipse启动出现“Failed to create the Java Virtual Machine”错误
Failed to create the Java Virtual Machine的本质是JVM内存分配不足. 启动eclipse的时候,JVM会自动分配内存,常见的包括Java堆,新生代和永久代的内 ...
- Flash Builder4.6 无法启动,并且报 Failed to create the Java Virtual Machine (2—可能更好些)...
转自:http://blog.csdn.net/major_/article/details/7232886 Flash Builder 4.6 启动出错, Failed to create the ...
- java machine 报错_Eclipse启动时报错:No java virtual machine
第一次碰到这个问题,因为Eclipse是同学拷贝过来给我的. 错误提示如下: A java Runtime Environment (JRE) or Java Development Kit (JDK ...
- 错误:Failed to create the Java Virtual Machine
引用:http://apps.hi.baidu.com/share/detail/30819988 以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又 ...
- Failed to create the Java Virtual Machine
以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又下了一个Eclipse IDE For Java EE Developers. 版本是:eclips ...
最新文章
- ios仿淘宝管理收货地址demo
- 【Paper】2010_Distributed optimal control of multiple systems
- 帧率ffmepg 摄像头_【WIN电竞】CSGO解除锁帧方法介绍
- mac word维吾尔文字体_字加软件更新啦!万款字体一键激活!
- mysql存储过程是不是不能穿sql语句_mysql存储过程能不能直接执行拼接的sql语句...
- 从前端智能化看“低代码/无代码”
- 寄存器和立即数和内存单元
- Abaqus安装在lincense server1出错
- NLP情感分析之情感分类
- 阀门的开关方向_一字阀门开关方向怎么辨认
- 常用计算机硬件故障检查方法,电脑硬件常见的故障检测及处理方法
- 东北财经计算机考研分数线,东北财经大学考研分数线_2021考研国家分数线什么时候出来...
- 【逻辑题】人与熊过河
- Debian 11 “bullseye” 安装笔记
- Eclipse android 项目转android studio填坑之旅
- postgre sql常用语法
- python点到线段的最小距离
- 好网角怎么发帖?文章发不出去怎么解决?
- 曾改变世界的最强科学,为什么我们对它的误解却越来越多?
- java8 strem的collector.toMap根据指定字段分组
热门文章
- Python:使用API——使用Pygal可视化仓库
- EAS BOS 单据打开新增界面设置字段默认值
- 电荷量Q=CU=It=Ne;左右手定则总结+安培定律 2020-3-15
- 支付系统设计五:对账系统设计01-总览
- 嵌入式系统设计---实时系统与嵌入式操作系统
- rem等于多少px?
- 如何享受人生,享受工作-读书笔记-得你所想、享你所得
- informatica 许可_informatica 常见问题及解决方案
- java验证手机号码的工具类-截止2022年中国大陆四家运营商以及虚拟运营商手机号码校验
- swift for 循环