jvm将类的装载过程分为3个步骤:装载,链接,初始化。而链接过程又分为:效验,准备,解析(可选)
1,
装载
负责找到二进制字节码并加载至jvm,jvm通过类的全限定名及类的加载器完成类的加载
2,
效验
对二进制字节码的格式进行效验
3,
准备
jvm为类变量分配内存,并设置默认初始值(譬如 reference设置为null boolean设置为false)
4,
解析(可选)
在类的常量池中寻找类,接口,字段,方法的符号引用,并把它替换为直接引用,在符号引用被程序首次主动使用之前,解析这个步骤是可选的
5,
初始化
为了准备让一个类或者接口首次主动使用,就要为类变量赋予正确的值(注意哦:是正确的值,不是默认值)。
什么是主动使用呢?6种活动被认为是主动使用
- (1) 调用了new。
- (2) 调用了类中的静态方法。
- (3) 调用了类中的非常量的静态字段。
- (4) 反射。
- (5) 子类的初始化方法。
- (6) jvm启动过程中指定的初始化类。
其中对于非常量的静态字段的调用还有一个条件是只有当类或者接口中的确声明了这个字段才被认为是主动使用,而对于子类或者实现接口调用父类的非常量的静态字段被认为是被动使用,不会触发初始化。如下:
public class Parent {
static int parent=(int) (Math.random()*3.0);
static {
System.out.println("老子出生了!!!");
}
}
public class Baby extends Parent {
static int baby=(int) (Math.random()*6.0)+2;
static {
System.out.println("老子经过不懈的努力,儿子也出生了~!!!");
}
}
public class Test {
public static void main(String[] args) {
int test=Baby.parent;
System.out.println(test);
}
static{
System.out.println("见证人上帝出世了!!!");
}
}
结果为:
见证人上帝出世了!!!
老子出生了!!!
1
parent是类Parent的非常量静态字段,Baby.parent触发了Parent的初始化,而Baby没有被初始化,也没有被加载。
而对于final static的字段,使用这样的字段,也不触发初始化
分享到:
相关推荐
java jvm类装载器原理 介绍较为详细 大家可以参考
JVM类加载过程
JVM实战-JVM类加载机制案例分析
深入JVM内核—原理、诊断与优化视频教程-6. 类装载器 深入JVM内核—原理、诊断与优化视频教程-6. 类装载器
首先讲述JVM的基本概念和原理、架构等。最后一HelloApp讲述JVM的工作过程
jvmgc过程介绍(jpg)
java之jvm学习笔记五(实践写自己的类装载器)
讲解JVM的ClassLoader子系统原理.
JVM类加载跟踪器,用于排查jar包冲突、类冲突、类版本冲突、NoClassDefFoundError、ClassNotFoundException 等等类加载相关问题的辅助工具
jvm 类加载机制 双亲委派模型 文档 jvm 类加载机制 双亲委派模型 文档
类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。
JVM类加载器 test
关于JVM的垃圾回收以及内存模型
主要介绍了JVM对dll文件的装载和对类的装载过程,针对Java在Windows下的一些运行情况作出讲解,需要的朋友可以参考下
jvm源码,jvm-native的源码,jvm支行机制,可对jvm的运行过程进行分析 个人网站:https://www.zhangjunbk.com
主要介绍了JVM垃圾回收的过程,帮助大家更好的理解和学习Java中的垃圾回收机制,感兴趣的朋友可以了解下
类装载 class装载流程 ClassLoader模式 ClassLoader的使用实例分析 热替换例子 详细介绍ClassLoader的原理和应用。分析2个案例,说明ClassLoader的使用。 第七课 性能监控工具 线程死锁分析 OOM分析 介绍常用的JVM...
jvm 启动过程
锁以及jvm类加载机制
对Java中JVM和JMM中技术根据手绘图来详细的展示。加深理解,让自己一次性解决JVM,吊打面试官是我们的目的。