上一篇:027-JVM-打破双亲委派机制https://yuhongliang.blog.csdn.net/article/details/111755901
从实践到理论总结的过程 。
1. 分析代码的执行过程
package com.yuhl.c2020;
/**
* @author yuhl
* @Date 2020/12/27 13:55
* @Classname Test2
* @Description TODO
*/
public class Test2 {
public static void main(String[] args) {
System.out.println("最终的打印结果为:" + T.count);
//System.out.println(T.finalCount);
}
}
class T {
public static int count = 2; //0
public static T t = new T(); // null
public final static int finalCount = 20; //0
//private int m = 8;
private T() {
System.out.println("T类的无参数的构造方法被调用了!");
System.out.println("count = " + count);
count ++;
System.out.println("我现在临时值:" + count);
//System.out.println("--" + count);
}
}
先给出答案:
T类的无参数的构造方法被调用了!
count = 2
我现在临时值:3
最终的打印结果为:3
2. 分析代码的执行过程
2.1 System.out.println(“最终的打印结果为:” + T.count);
要打印T.count的值,需要下加载T仅内存,加载class文件进内存需要以下几步:
2.2 由AppClassLoader类加载器记载
2.3 verification阶段判断class文件是否合法合规
2.4 preparation为变脸服初值
此时:
public static int count = 0; //0
public static T t = null; // null
2.5 简介引用变直接引用:
是有有这步取决于此处的boolean值是否为真
2.6 initialization阶段
- public static int count = 2; //0 赋值
- public static T t = new T();调用狗在其对count ++; 所以count=3
分析完成。
3. 另一个例子
package com.yuhl.c2020;
/**
* @author yuhl
* @Date 2020/12/27 13:55
* @Classname Test2
* @Description TODO
*/
public class Test2 {
public static void main(String[] args) {
System.out.println("最终的打印结果为:" + T.count);
//System.out.println(T.finalCount);
}
}
class T {
public static T t = new T(); // null
public static int count = 2; //0
public final static int finalCount = 20; //0
//private int m = 8;
private T() {
System.out.println("T类的无参数的构造方法被调用了!");
System.out.println("count = " + count);
count ++;
System.out.println("我现在临时值:" + count);
//System.out.println("--" + count);
}
}
和上面例子的不同在于:
4. 也给出结果
T类的无参数的构造方法被调用了!
count = 0
我现在临时值:1
最终的打印结果为:2
5. 分析过程
5.1 System.out.println(“最终的打印结果为:” + T.count);
要打印T.count的值,需要下加载T仅内存,加载class文件进内存需要以下几步:
5.2 由AppClassLoader类加载器记载
5.3 verification阶段判断class文件是否合法合规
5.4 preparation为变脸服初值
此时:
public static T t = null; // null
public static int count = 0; //0
5.5 简介引用变直接引用:
是有有这步取决于此处的boolean值是否为真
5.6 initialization阶段
- public static T t = new T();调用狗在其对count ++; 所以count=1
分析完成。 - 代码顺序执行 count = 2; 所以输出为2.
6. 总计
要明白整个类加载子系统中各个阶段都做了什么事情。
通过这个例子应该很明白了整个过程了吧
- verification: 验证未见是否符合jvm规范,合法性检查
- preparation:静态变量默认值,记住是默认值哦!
- resolution:讲类、方法、属性的符号引用解析为直接引用,蝉联吃汇总的各种符号引用解析为指针,偏移量等内存地址的直接引用
- initializing:嗲用类初始化代码static代码块、static代码赋值(不是初值,是程序员福德之)哦!
下一篇:029-JVM-volatile和指令重排https://yuhongliang.blog.csdn.net/article/details/111997753