类(如果无特殊说明,本文中的“类”表示类和接口,下同)的初始化主要包括初始化的同步及执行其初始化方法<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》相关推荐

  1. java virtual的作用_JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚

    存储交换根据传递信息单位的大小可分为() 请简要回答1951年<幼儿园暂行规程>和<幼儿园暂行教学纲要>所规定的幼儿园的教养原则. 下列哪种下载方式不需要服务器?() 技能考核 ...

  2. [The Java8 Virtual Machine Specification述]Chapter2

    Chapter 2. The Structure of the Java Virtual Machine This document specifies an abstract machine. It ...

  3. eclipse failed to create the java virtual machine 问题图文解析

    eclipse failed to create  the java virtual  machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ec ...

  4. 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:" ...

  5. Eclipse启动出现“Failed to create the Java Virtual Machine”错误

    Failed to create the Java Virtual Machine的本质是JVM内存分配不足. 启动eclipse的时候,JVM会自动分配内存,常见的包括Java堆,新生代和永久代的内 ...

  6. 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 ...

  7. java machine 报错_Eclipse启动时报错:No java virtual machine

    第一次碰到这个问题,因为Eclipse是同学拷贝过来给我的. 错误提示如下: A java Runtime Environment (JRE) or Java Development Kit (JDK ...

  8. 错误:Failed to create the Java Virtual Machine

    引用:http://apps.hi.baidu.com/share/detail/30819988 以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又 ...

  9. Failed to create the Java Virtual Machine

    以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又下了一个Eclipse IDE For Java EE Developers. 版本是:eclips ...

最新文章

  1. ios仿淘宝管理收货地址demo
  2. 【Paper】2010_Distributed optimal control of multiple systems
  3. 帧率ffmepg 摄像头_【WIN电竞】CSGO解除锁帧方法介绍
  4. mac word维吾尔文字体_字加软件更新啦!万款字体一键激活!
  5. mysql存储过程是不是不能穿sql语句_mysql存储过程能不能直接执行拼接的sql语句...
  6. 从前端智能化看“低代码/无代码”
  7. 寄存器和立即数和内存单元
  8. Abaqus安装在lincense server1出错
  9. NLP情感分析之情感分类
  10. 阀门的开关方向_一字阀门开关方向怎么辨认
  11. 常用计算机硬件故障检查方法,电脑硬件常见的故障检测及处理方法
  12. 东北财经计算机考研分数线,东北财经大学考研分数线_2021考研国家分数线什么时候出来...
  13. 【逻辑题】人与熊过河
  14. Debian 11 “bullseye” 安装笔记
  15. Eclipse android 项目转android studio填坑之旅
  16. postgre sql常用语法
  17. python点到线段的最小距离
  18. 好网角怎么发帖?文章发不出去怎么解决?
  19. 曾改变世界的最强科学,为什么我们对它的误解却越来越多?
  20. java8 strem的collector.toMap根据指定字段分组

热门文章

  1. Python:使用API——使用Pygal可视化仓库
  2. EAS BOS 单据打开新增界面设置字段默认值
  3. 电荷量Q=CU=It=Ne;左右手定则总结+安培定律 2020-3-15
  4. 支付系统设计五:对账系统设计01-总览
  5. 嵌入式系统设计---实时系统与嵌入式操作系统
  6. rem等于多少px?
  7. 如何享受人生,享受工作-读书笔记-得你所想、享你所得
  8. informatica 许可_informatica 常见问题及解决方案
  9. java验证手机号码的工具类-截止2022年中国大陆四家运营商以及虚拟运营商手机号码校验
  10. swift for 循环