从JVM 源码看init和clinit到底什么区别

简介: 从JVM 源码看init和clinit到底什么区别

JVM 源码,都是初始化方法

image.png

1 执行时机

  • init是构造器时
  • clinit是类构造器时,也就是在类加载—–验证—-解析—–初始化,中的初始化阶段jvm调用clinit方法

2 执行目的

看 JVM 源码:

image.png

is_static是啥?

image.png

  • init是instance实例构造器,对非静态变量解析初始化
  • clinit是class类构造器对静态变量,静态代码块进行初始化

3 clinit详解

准备阶段,变量已经赋过一次系统要求的初始值

在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器<clinit>方法的过程。


<clinit>方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问

image.png

虚拟机会保证在子类的<clinit>方法执行之前,父类的<clinit>方法已经执行完毕。

因此在虚拟机中第一个被执行的<clinit>方法的类肯定是java.lang.Object。意味着父类中定义的静态语句块要优先于子类的变量赋值操作


接口中不能使用静态语句块,但仍有变量初始化的赋值,因此接口与类一样都会生成<clinit>方法。

不同的是,执行接口的<clinit>方法不需要先执行父接口的<clinit>方法。 只有当父接口中定义的变量使用时,父接口才会初始化。

另外,接口的实现类在初始化时也一样不会执行接口的<clinit>方法。

接口中的属性都是static final类型的常量,因此在准备阶段就已经初始化

目录
相关文章
|
2月前
|
安全 前端开发 Java
JDK源码级别彻底剖析JVM类加载机制
JDK源码级别彻底剖析JVM类加载机制
|
5月前
|
Java 编译器 API
【Java核心】JDK、JRE、 JVM的联系与区别
【Java核心】JDK、JRE、 JVM的联系与区别
118 0
|
4月前
|
Java 编译器 Apache
JDK,JRE,JVM之间的区别和联系
JDK,JRE,JVM之间的区别和联系
72 0
|
2月前
|
存储 安全 Java
JDK、JRE 和 JVM 的区别和联系
JDK、JRE 和 JVM 的区别和联系
23 0
|
3月前
|
Java
Native Image部署和JVM部署的主要区别
Native Image部署和JVM部署的主要区别
|
10月前
|
存储 算法 安全
15-大厂面试题-JVM垃圾回收采用的是什么算法,有什么区别和优劣?
通过之前的学习,我们知道了JVM会通过**可达性算法**来筛选出哪些对象是可回收的,哪些对象是不可回收的,GCRoots对象是哪些,java的引用类型有哪些以及finlize()方法的作用。同时我们也知道了当一个对象在创建的时候是存放在堆内存中的新生代里的,那么当新生代内存满了后就会触发Minor GC;但是问题是我们如何针对新生代内存进行管理,以及如何进行回收这也是一个值得分析和探讨的问题。
68 0
|
5月前
|
安全 Java
JVM-intern方法在1.6和1.8版本实现区别
JVM-intern方法在1.6和1.8版本实现区别
|
5月前
|
存储 开发框架 Java
JDK,JRE,JVM区别与联系
JDK,JRE,JVM区别与联系
24 0
|
8月前
|
Java 编译器
JVM、JRE和JDK的区别与联系
JVM、JRE和JDK的区别与联系
49 0
|
9月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因: