从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类型的常量,因此在准备阶段就已经初始化

目录
相关文章
|
7月前
|
安全 前端开发 Java
JDK源码级别彻底剖析JVM类加载机制
JDK源码级别彻底剖析JVM类加载机制
|
7月前
|
Java 编译器 API
【Java核心】JDK、JRE、 JVM的联系与区别
【Java核心】JDK、JRE、 JVM的联系与区别
230 0
|
7月前
|
Java 编译器 Apache
JDK,JRE,JVM之间的区别和联系
JDK,JRE,JVM之间的区别和联系
121 0
|
1月前
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
33 1
|
5月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
73 0
|
4月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
5月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
4月前
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
73 2
|
4月前
|
人工智能 Java 编译器
Java零基础(3) - 区别JDK、JRE和JVM
【8月更文挑战第3天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
78 1
|
5月前
|
安全 Java fastjson
JVM 配置参数 -D,-X,-XX 的区别
JVM 配置参数 -D,-X,-XX 的区别
115 2