类加载分7个步骤:
1:加载
1)通过一个类的全限定名来获取此类的二进制字节流
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
2:验证
保证Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
1)文件格式验证,如版本号是否对,是否以魔数OxCAFEBABE开头等,经过这个阶段基于字节流进行的验证之后,字节流进入内存的方法去中进行存储,后面的三个验证阶段都是基于方法区的存储结构进行的。
2)元数据验证,这一阶段是语义分析阶段,如是否有父类(除Object外都应该有父类),是否继承了不允许被继承的类。
3)字节码验证,这一阶段是对方法体进行验证,主要是进行数据流和控制流的分析。如保证跳转指令不会跳转到方法体以外的字节码指令上。
4)符号验证,将符号引用转化为直接引用
如果所运行的代码已经被验证过,在实施阶段可以使用-Xvefiry:none参数来关闭大多数的类验证措施,以缩短虚拟机类加载的时间。
3:准备
为类变量分配内存并设置类变量的初始值(即默认值),但不包括实例变量,常量的话会直接赋值他原来的值,不会是赋值默认值。
4:解析,
将常量池类的符号引用替换为直接引用
解析可能会在初始化之后,这是为了java的动态绑定。
5:初始化,执行所有的类变量赋值和静态语句块的执行。
6:使用
7:卸载
只有当加载该类的类加载器实例变为unreachable状态时,当前类才会被卸载。
另:
(1)类加载器已经在Tomcat理解的比较透彻,这里就不贴了
(2)通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。如SubClass.value中如果value是在父类中定义的静态字段,则这样调用只会初始化父类。
(3)但一个类在初始化时,要求其父类都已经初始化了,但是对接口没有这个要求。
(4)一个类A有另一个类B的常量的引用,在编译阶段已经将类B的常量转换为对A类自身常量池的引用了。所以在A类的class文件之中并没有B类的符号引用入口。
参考 :
《深入理解java虚拟机》周志明
分享到:
相关推荐
JVM实战-JVM类加载机制案例分析
讲解JVM的ClassLoader子系统原理.
jvm 类加载机制 双亲委派模型 文档 jvm 类加载机制 双亲委派模型 文档
锁以及jvm类加载机制
JVM类加载过程
从JDK源码级别剖析JVM类加载机制
性能调优专题-jvm类加载机制-performance-jvmclassloader
1. 类的静态变量 2. 类的静态代码块 3. 类的静态变量 4. 类的静态代码块 5. 类的静态变量 6. 类的静态代码块 7. 类的构造法 8. 类的静态变
Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性...
对jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,
java中JVM类加载器和双亲委派机制剖析,类加载示例、加载器示例、自定义一个类加载器示例;Tomcat自定义加载器详解
本文主要介绍了JVM类加载机制的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
主要介绍了一文读懂Jvm类加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要给大家介绍了关于JVM类加载机制及类缓存问题的处理方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...
主要介绍了JVM类加载机制原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
介绍Java类的加载机制,对于深入理解Java的深层原理很有帮助
jvm系列一java类的加载机制.doc
jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice