准备
两个目标:
案例
- public static final int value = 123;
准备阶段后 value 的值为 0,而非 123,初始化后才为 123。
但若是被final修饰,若有初始值,则在编译阶段就会将初始值存入constantValue属性中,在准备阶段就将constantValue的值赋给该字段(此处将value赋为123)。
解析
把常量池中的符号引用转换成直接引用。
一组无歧义的符号来描述所引用的目标,与JVM的实现无关
直接指向目标的指针、相对偏移量、或是能间接定位到目标的句柄,和JVM实现相关
主要针对:类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符。
初始化
真正开始执行类中定义的Java程序代码(或是字节码)。
类的初始化就是为类的static变量赋初始值,初始化阶段就是执行类构造器
若是接口
调用Classloader类的loadClass方法来装载一个类,并不会初始化这个类,不属于对类的主动使用
clinit()方法由编译器自动产生,收集类中static代码块中的类变量赋值语句和类中static变量的赋值语句:
在准备阶段,类中static变量已完成默认初始化
而在初始化阶段,clinit()方法对static变量进行显式初始化
类的初始化时机
Java程序对类的使用方式分为:
JVM必须在每个类或接口“首次主动使用”时才初始化它们,被动使用类不会导致类的初始化。
主动使用的场景
FAQ
- public class Test {
- static {
- i = 0;
- System.out.println(i); //编译失败:"非法向前引用"
- }
- static int i = 1;
- }
其他线程虽会被阻塞,只要有一个clinit()方法执行完,其它线程唤醒后不会再进入clinit()方法。同一个类加载器下,一个类型只会初始化一次。
类的卸载
当代表一个类的Class对象不再被引用,那么Class对象的生命周期就结束了,对应的在方法区中的数据也会被卸载。Jvm自带的类加载器装载的类,是不会卸载的,由用户自定义的类加载器加载的类是可以卸载的。
背景 我们知道 如果在Kubernetes中支持GPU设备调度 需要做如下的工作 节点上安装...
本文转载自公众号读芯术(ID:AI_Discovery)。 这一刻你正在应对什么挑战?这位前...
本文转载自微信公众号「bugstack虫洞栈」,作者小傅哥 。转载本文请联系bugstack...
在Python开发过程中,我们难免会遇到多重条件判断的情况的情况,此时除了用很多...
基本介绍 给定 n 个权值作为 n 个叶子节点,构造一颗二叉树,若该树的带权路径长...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
TIOBE 公布了 2021 年 3 月的编程语言排行榜。 本月 TIOBE 指数没有什么有趣的变...
前言 统计科学家使用交互式的统计工具(比如R)来回答数据中的问题,获得全景的认...
近几年,互联网行业蓬勃发展,在互联网浪潮的冲击下,互联网创业已成为一种比较...
溢价 域名 的续费价格如何?通常来说,因为溢价域名的价值高于普通域名,所以溢...