Java虚拟机-JVM学习笔记(五)
第五章 Java类加载机制
.java文件被编译成 .class文件,类加载子系统将.class文件中的二进制数据加载到方法区,同时在Java堆建立java.lang.Class对象封装方法区中的数据结构
类加载条件:
类加载过程:加载、验证、准备、解析、初始化 五个阶段
加载:
(1)通过一个类的全限定名获取定义的二进制数据流
(2)解析类的二进制数据流为方法区内的数据结构
(3)在堆中生成一个Class对象,作为方法区数据结构使用的入口
验证:验证类的正确性,包括文件格式检查、语义检查、字节码验证、符号语义验证
准备:类变量分配内存并设置初始值
解析:解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。
初始化:在初始化阶段,主要为类的静态变量赋予正确的初始值
类加载器:主要作用是从系统外部获取二进制数据流。
ClassLoader分类:
启动类加载器(Boostrap ClassLoader) 扩展类加载器(Extension ClassLoader)
应用类加载器(App ClassLoader) 自定义加载器
加载一个类时,先自底向上检查类是否已被加载。当系统需要加载一个类时,从顶层开始加载,依次向下尝试,直到成功
类加载的三种模式:
(1)通过命令行启动应用时由JVM初始化加载含有main()方法的主类。
(2)通过Class.forName()方法动态加载,会默认执行初始化块(static{}),但是Class.forName(name,initialize,loader)中的initialze可指定是否要执行初始化块。
(3)通过ClassLoader.loadClass()方法动态加载,不会执行初始化块。
类加载器的双亲委托模式:类加载的时候,先判断是否已经被加载,已经被加载,直接返回可用的类;否则会尝试加载,会先请求双亲处理,如果请求失败或加载不成功,则会自己加载。优点:方便加载,父类加载了子类就不用重新加载。