hexdump -C demo.class
-XX:+TraceClassLoading
-Xverify:none
将“经过一个类的全限定名来获取描述此类的二进制字节流”这个动做放到Java虚拟机外部去实现,以便让应用程序本身决定如何去获取所须要的类。java
一、加载 二、链接 |- 验证 |- 准备 |- 解析 三、初始化 四、使用 五、卸载
加载:获取二进制字节流,并存储至方法区(文件格式验证经过后才存储)。数组
验证:确保Class文件的字节流中包含的信息符合当前虚拟机的要求。微信
准备:在方法区中分配类变量的内存并设置类变量初始值(一般状况下是零值)。模块化
解析:虚拟机将常量池内的符号引用替换为直接引用的过程。.net
初始化:执行类构造器<clinit>()方法的过程,前面都是由虚拟机主导和控制(自定义类加载除外),初始化才是执行类中定义的字节码。线程
补充:链接与加载是交叉的code
双亲委派 -> 委派双亲对象
工做过程: 若是一个类加载器收到了类加载的请求,将会把这个请求委派给父类加载器去完成(直到最顶级),当父加载器反馈本身没法完成这个加载请求时,子加载器才会尝试本身去加载。接口
好处: Java类随着它的类加载器一块儿具有了一种带有优先级的层次关系。生命周期
同一个类加载器下,一个类型只会初始化一次【有锁机制】。
经过子类引用父类的静态字段,不会致使子类的初始化。
经过数组定义来引用类,不会触发此类的初始化。
static final修饰的,在编译阶段会存入调用类的常量池中,不须要类的初始化。
static 非final的,set与get时,须要触发类的初始化。
接口与类的区别
https://my.oschina.net/gmarshal
欢迎关注个人我的微信订阅号:(听说这个头像程序猿专用)