类的生命周期
类的生命周期指的是在Java程序中,一个类从编写到被加载、连接、初始化、使用、卸载的整个过程。类的生命周期可以分为以下几个阶段:
加载,验证,准备,解析,初始化,使用,卸载。
类的加载过程
加载,验证,准备,解析,初始化
加载阶段:加载阶段是指将类的字节码文件加载到内存中,并生成一个代表该类的Class对象; 加载阶段的工作由类加载器(ClassLoader)来完成,包括通过类的全限定名查找字节码文件,并将字节码文件加载到内存中。
连接阶段:连接阶段包括验证、准备和解析三个步骤
验证:确保被加载的类符合Java虚拟机规范,不会造成安全问题。
准备:为类变量(静态变量)分配内存,并设置默认初始值。(不包括实例对象)
解析:将类、接口、字段和方法的符号引用解析为直接引用。
初始化阶段:初始化阶段是类加载过程中的最后一个阶段;执行<clinit>方法,Java虚拟机会按照程序员的要求执行类的初始化操作,例如执行静态变量的赋值操作、执行静态代码块等。
使用阶段:当类成功加载并初始化后,就可以在程序中使用该类,创建对象实例、调用方法等。
卸载阶段:如果一个类不再被引用,该类的对象和类加载器实例被垃圾回收,那么这个类可能会被卸载,释放内存空间。
类的生命周期包括了加载、连接、初始化、使用和卸载等阶段,这些阶段都是类在程序运行过程中所经历的重要阶段。
类加载器
将类的字节码文件加载到内存中,并生成对应的Class对象。类加载器通常负责从文件系统、网络或其他来源加载类的字节码,并将其转换为可执行的Java类。
类加载器分为哪些呢?
启动类加载器(Bootstrap Class Loader):加载核心类库,java_home/lib或-Xbootclasspath指定路径存放的类库,比如:java.io,java.util等;扩展类加载器(Extension Class Loader):加载java_home/lib/ext目录下或java.ext.dirs指定路径的类库,比如:JDBC,Java Image I/O API;应用程序类加载器(Application Class Loader):加载用户类路径的类库
什么是双亲委派机制?
类加载器收到类加载请求后,不会自己去尝试加载,而是交给父类加载器进行加载,因此最后类加载的请求会转送至启动类加载器。当父类加载器加载不了的时候,才会交给子类加载器进行加载。其优点在于避免类的重复加载;避免Java核心类被破坏;
如何破坏双亲委派机制
重写loadclass()方法
摘自:《深入理解Java虚拟机》第三版 周志明著