1.生命周期:
- 加载:查找并加载类文件的二进制数据
连接:将已经读入内存的类的二进制数据合并到JVM运行环境中去,包含如下步骤:
1.验证:确保被加载类的正确性<br /> 2.准备:为类的 静态变量 分配内存<br /> 3.解析:把常量池中的符号引用转换成直接引用
初始化:为类的静态变量赋初始值
2.类加载完成的功能
- 通过类的全限定名来获取该类的二进制字节流
- 把二进制字节流转化为方法区的运行时数据结构
在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内数据结构的接口(通过反射)
3.加载类的方式
最常见方式:本地文件系统中加载、从jar等归档文件中加载
- 动态的方式:将Java源文件动态编译成class
- 其他方式:网络下载、从专有数据库中加载等
4.类加载器
- Java虚拟机自带加载器
- 启动类加载器(BootstrapClassLoader).最基本的类加载器,本地语言编写,不需要被加载,直接被嵌套在虚拟机中(是虚拟机自身的一部分),该类加载负责加载 ${JAVA_HOME}/lib/ 路径下核心类库(rt.jar)或者 -Xbootclasspath 参数指定的路径下的jar包加载到内存中
- 平台类加载器(PlatfromClassLoader),Jdk1.8 扩展类加载器。该类加载器负责加载 ${JAVA_HOME}/lib/ext/目录下或者由系统变量 -Djava.ext.dir 指定位路径中的类库(改名原因:1.扩展类加载器主要加载jre环境下lib下的ext文件下jar包,当我们需要扩展,把jar放到该文件夹下,这种方式不是很安全;2.Jdk9引入模块化,这种扩展机制被模块化天然扩展能力取代)
- 应用程序类加载器(AppClassLoader).负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,就是我们经常用到的classpath路径。一般情况下该类加载是程序中默认的类加载器,通过ClassLoader.getSystemClassLoader()就能获取。
- 自定义类加载器:定制类的加载方式,自定义类加载器在所有系统类加载的最后。