JVM类加载
类的生命周期
- 加载
- 验证(连接)
- 准备(连接)
- 解析(连接)
- 初始化
- 使用
- 卸载
类加载过程
如何加载.class文件
主要分为三步:加载->连接->初始化
加载
类的加载是指将类的字节码从某个介质加载到JVM内存中。此时JVM需要根据类的全限定名(包括包名和类名)来查找文件。
查找类:JVM会通过类加载器ClassLoader根据类名找到类的.class文件
- 例如:通过系统类路径classpath、JAR包、或者其他配置路径来寻找文件
- 在应用服务器、动态代理场景下,类可能通过网络加载。
读取字节码:一旦找到类文件,JVM会读取.class文件的内容,并将其转换为字节流。类加载器负责将这些字节流传递给JVM进一步处理。
加载进入内存:在内存中生成一个代表该类的class对象,作为方法区这些数据的访问入口。
类加载器有很多种,当我们想要加载一个类的时候,具体哪个类加载器加载由双亲委派模型决定。
验证
验证是链接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当做代码运行后不避讳危害虚拟机自身的安全。
验证阶段这一步在整个类加载过程中耗费的资源相对较多,但是可以防止恶意代码的执行。
我们可以通过添加虚拟机参数-Xverify:none来关闭类验证措施
准备
解析
初始化
类卸载
卸载类即该类的Class对象被GC,卸载类需要满足3个要求。
- 该类的所有实例对象都已经被GC
- 该类没有在其他任何地方被引用
- 该类的类加载器的实力已经被GC
所以JVM生命周期内,由JVM自带的类加载器加载的类不会被卸载,但由自定义的类加载器加载的类是可能被卸载的。
JDK 自带的 BootstrapClassLoader, ExtClassLoader, AppClassLoader 负责加载 JDK 提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。
JVM类加载
https://yicizhang00.github.io/posts/编程语言/Java/Java基础/类加载过程/