标签:ebe final height 转换 通过 字段 成员变量 类型 ref
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。
加载是类加载过程中的一个阶段,这个阶段虚拟机要完成3件事。
这一阶段的主要目的是为了确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证主要包含4个阶段的校验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。
准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。注意这里所说的初始值概念,比如一个类变量定义为:
public static int value = 123;
实际上变量 value 在准备阶段过后的初始值为 0 而不是 123,将 value 赋值为 123 的 putstatic 指令是程序被编译后,存放于类构造器方法之中。
但是注意如果声明为:
public static final int value = 123;
在编译阶段会为 value 生成 ConstantValue 属性,在准备阶段虚拟机会根据 ConstantValue 属性将 value 赋值为 123。
解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是在 class 文件中以: CONSTANT_Class_info、CONSTANT_Field_info
、CONSTANT_Method_info等类型的常量出现。
初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。
那么,什么时候开始初始化?
以上情况称为对一个类进行主动引用,且有且只要以上几种情况需要对类进行初始化。
当使用 Java 命令运行 Java 程序时,此时 JVM 启动,并去方法区下找 Java 命令后面跟的类是否存在,如果不存在,则把类加载到方法区下(还记得运行时数据区域里的方法区吗?)
在类加载到方法区时,会分为两部分:
上边这两部分概括为如下五步:
巴拉巴拉,一堆理论,不够形象,补张图
如下是一道真实的面试题,希望上文的理论部分对你有所帮助!
class Singleton{
private static Singleton singleton = new Singleton();
public static int value1;
public static int value2 = 0;
private Singleton(){
value1++;
value2++;
}
public static Singleton getInstance(){
return singleton;
}
}
class Singleton2{
public static int value1;
public static int value2 = 0;
private static Singleton2 singleton2 = new Singleton2();
private Singleton2(){
value1++;
value2++;
}
public static Singleton2 getInstance2(){
return singleton2;
}
}
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("Singleton1 value1:" + singleton.value1);
System.out.println("Singleton1 value2:" + singleton.value2);
Singleton2 singleton2 = Singleton2.getInstance2();
System.out.println("Singleton2 value1:" + singleton2.value1);
System.out.println("Singleton2 value2:" + singleton2.value2);
}
说出运行的结果:
Singleton1 value1 : 1
Singleton1 value2 : 0
Singleton2 value1 : 1
Singleton2 value2 : 1
如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo
标签:ebe final height 转换 通过 字段 成员变量 类型 ref
原文地址:https://www.cnblogs.com/niceyoo/p/10567294.html