JVM中类加载过程是什么?
引言
在Java程序运行过程中,类的加载是至关重要的环节,它直接关系到程序的执行效率和安全性。类加载不仅仅是简单地将.class文件读取到内存中,而是经历了加载、连接(包含验证、准备和解析)以及初始化等多个复杂步骤,最终将类的结构和行为完整地映射到JVM内存中。通过这一系列过程,JVM能够确保类的正确性、安全性和高效执行,同时支持动态加载和卸载功能。深入理解类加载的全过程,有助于开发者更好地掌握Java的运行机制,优化程序性能,并有效地诊断和解决类加载相关的问题。
类加载过程
加载:通过类的全限定名(包名+类名),获取该类的.class文件的二进制字节流。将二进制字节流所代表静态存储结构,转化为方法区运行时的数据结构。在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。(这个阶段需要用到加载器,双亲委派模型与此有关。)
连接:验证、准备、解析3个阶段统称为连接。
验证:确保class文件中的字节流包含的信息,符合当前虚拟机的要求,保证被加载的class类的正确性。(毕竟class文件的产生途径不清楚,如果完全信任的话,很可能载入了有错误的字节码流导致系统崩溃)验证阶段大致会完成四个阶段的检验动作:文件格式校验、元数据验证、字节码验证、符号引用验证。
准备:为类中的静态字段分配内存,并设置默认的初始值,比如int类型初始值是0。被final修饰的static字段不会设置,因为final在编译的时候就分配了。
解析:这个阶段是虚拟机将常量池的符号引用直接替换为直接引用的过程。(符号引用是以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用的时候可以无歧义地定位到目标即可。直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄,直接引用是和虚拟机实现的内存布局相关的。如果有了直接引用,那引用的目标必定已经存在在内存中了。)
初始化:是类加载过程的最后一阶段。准备阶段时,静态变量已经赋过一次系统要求的初始零值,而在初始化阶段,则会根据代码编写的实际情况去初始化类变量和其它资源。简单来说就是执行类的构造器方法。
使用:使用类或者创建对象。
卸载:如果有下面的情况,类就会被卸载:1. 该类所有实例都已经被回收,也就是java堆中不存在该类的任何实例。2. 加载该类的ClassLoader已经被回收。3. 类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类。
感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!