"关于JVM的总结,涵盖了类的生命周期和类加载机制,包括加载、验证、准备、解析、初始化、使用和卸载七个阶段,以及类加载器的双亲委派模型。"
在Java虚拟机(JVM)中,类的生命周期包括了七个关键阶段:
1. **加载**:当程序需要使用某个类时,JVM会通过类的全限定名将类加载到方法区,并在堆内存中创建一个`java.lang.Class`对象作为访问方法区数据的入口。
2. **验证**:此阶段JVM会检查Class文件的字节流是否符合JVM规范,确保其安全性和有效性,防止恶意代码的注入。
3. **准备**:在这个阶段,JVM为类的静态变量分配内存,并赋予它们默认的初始值,这些变量存储在方法区。
4. **解析**:解析过程是将常量池中的符号引用转换为直接引用,这一操作可以发生在初始化之前或之后,取决于运行时绑定的需求。
5. **初始化**:初始化阶段会执行类的静态初始化语句块和静态变量的赋值,实际是执行`<clinit>()`方法,这个方法是由编译器自动生成的,包含了类中静态变量的赋值操作和静态代码块的执行。需要注意的是,静态代码块的执行顺序取决于它们在源码中的顺序,而不能访问在其之后定义的静态变量。
6. **使用**:类加载后,便可以被使用,执行其方法,访问其成员变量。
7. **卸载**:当类不再被使用,且满足特定条件时,JVM会将其卸载出内存,这是生命周期的最后一步。
类加载机制的核心是**双亲委派模型**,它描述了类加载器之间的层次关系。加载请求会从顶层的启动类加载器开始,向下传递,直到找到能够加载该类的加载器。如果父加载器无法加载,则子加载器才会尝试加载。这种模型保证了核心库与用户自定义类的隔离,避免了类加载冲突。
- **启动类加载器(Bootstrap ClassLoader)**:负责加载JDK核心类库,如rt.jar。
- **拓展类加载器(Extension ClassLoader)**:加载JRE扩展目录下的jar包。
- **应用程序类加载器(Application ClassLoader)**:加载用户类路径上的类,也被称为系统类加载器。
类加载器之间的父子关系不是继承关系,而是委托关系,保证了对Java标准库的统一加载,提高了系统的安全性。