jvm培训:jvm类的初始化

来说说类加载过程的最后一个阶段,类初始化。对于类初始化来说,有一个特殊的初始化方法叫(对象实例化的方法叫),这个名称是由编译器提供的,我们没法显示调用。
  jvm培训

一、触发初始化。
  当执行以下操作的时候,会调用方法:
  1、当对类C进行方法/字段的直接或者间接引用,jvm第一次执行new/putstatic/getstatic/invokestatic(就是new一个C对象,或者是对类C中的静态变量存或者取的时候,亦或者是调用类C的静态方法时)
  2、使用Class.forName,反射的时候(如果指定参数initialize为false时,不会触发类初始化)
  3、当接口声明一个既不是abstract,也不是static的方法时(jdk1.8以后允许这样定义接口方法),实现该接口的类初始化的时候,会导致接口的初始化
  4、启动类会被初始化
  5、初始化子类时,若父类未被初始化,则会先初始化父类
  二、类初始化的具体处理过程。
  对于java虚拟机来说,它是多线程的,所以类和接口在初始化的时候,很有可能会有很多个线程对类进行初始化的请求,所以就需要对以下的动作进行同步:
  1、Class已经验证好了,但并未开始初始化
  2、Class正在被其他的特定线程初始化
  3、Class已经初始化完成
  4、Class处于错误的状态,尝试初始化失败
  针对这些情况,jvm加上了一个锁的机制,对每个类或者是接口来说,都会有一个唯一的初始化锁LC,这个初始化锁与类的映射关系取决于jvm的实现。可以是类的监视器,也可以是一个类。加锁之后的处理过程如下:
  1、当线程A初始化一个类C的时候,对锁LC进行加锁操作
  2、这时候线程B对类C也进行初始化的请求,会发现拿不到锁LC,则线程B会阻塞,直到线程A对类C初始化成功。
  3、线程A初始化类C成功,将类C的初始化状态改为initialized,释放锁LC。
  4、线程B被唤醒,获取到锁LC,但此时类C的初始化状态已经是initialized,则不会对类C进行初始化,释放锁LC。
  5、如果类C处于一个错误的状态,会导致类C无法被初始化。线程A释放锁LC,抛出NoClassDefoundError的错误
  6、如果类C正常初始化之后,接下来就是执行类C的静态初始化块和初始化类中声明的静态变量了
  三、总结一下类加载过程需要注意的知识点
  1、类加载时机
  2、类加载器、双亲委派模式、运行时常量池的概念
  3、static final定义的类成员变量
  4、符号引用、直接引用
  5、什么时候会导致类的初始化
  推荐阅读:jvm培训:如何判断哪些对象需要回收?
  如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值