JAVA类加载过程详解
Java类加载是指将Java源文件编译成字节码文件,并将字节码文件加载到JVM中执行的过程。Java的类加载机制具有动态性和延迟性,能够在程序运行过程中动态加载和卸载类,并且只有在首次使用时才会将类加载到内存中。
Java类加载过程主要包括以下几个步骤:
1. 加载(Loading):将类的字节码文件加载到JVM中的方法区中,并形成一个Class对象。加载类的过程是通过类加载器完成的,Java提供了三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader),它们之间形成了父子关系。
启动类加载器负责加载JVM自身需要的类,扩展类加载器负责加载JRE扩展目录中的类,应用类加载器负责加载用户自定义类。类加载器之间通过委托机制来完成类的加载,即先委托父加载器进行加载,如果父加载器无法完成加载,再由子加载器自己去加载。
2. 链接(Linking):将类的符号引用解析为直接引用,并进行校验。符号引用是指在编译阶
段通过类或接口的全限定名来引用其他类或接口,直接引用是指直接指向内存中已经加载的类的指针。链接过程主要包括三个阶段:验证(Verification)、准备(Preparation)和解析(Resolution)。
验证:对字节码文件进行验证,确保字节码文件的正确性,比如检查魔数是否正确、类的版本是否合法、字段是否存在等。
准备:为静态字段分配内存,并初始化为默认值。静态字段和实例字段存放在不同的内存区域,准备阶段只分配内存,不会进行初始化。
解析:将类的符号引用解析为直接引用,解析过程主要是根据类的全限定名查类的字节码文件,并将字节码文件加载到内存中。
3. 初始化(Initialization):对类的静态字段进行初始化,并执行静态代码块。此时,类的字节码文件已经加载到内存中,并创建了对应的Class对象,但还未创建类的实例。
类的初始化有以下几种情况:
- 当一个类被创建时,需要先初始化父类(除了java.lang.Object)。
-当一个类中的一些静态方法或静态字段被调用时,需要先初始化该类。
-当一个类的实例被创建时,需要先初始化该类。
java创建文件
-当一个类中定义了JVM回调的方法,需要先初始化该类。
类的初始化是由JVM来完成的,它负责执行类的静态变量赋值和静态代码块中的代码,并且保证初始化过程是线程安全的。
4. 使用(Using):在内存中创建类的实例,并调用实例的方法。此时,类的字节码文件已经加载到内存中,并创建了对应的Class对象,类的实例也已经创建。
类的使用是指通过类的实例来调用类的实例方法、静态方法和访问成员变量等。
5. 卸载(Unloading):当类不再被使用时,将其从JVM中卸载。当一个类不再被引用,并且类的实例也被回收时,类加载器会通知JVM将类卸载,释放掉该类的内存空间。
类的卸载是由JVM来完成的,它提供了垃圾回收机制来自动回收不再使用的类。
总结起来,Java类的加载过程是通过类加载器将类的字节码文件加载到方法区中,并形成一个Class对象。加载过程主要包括加载、链接、初始化三个阶段。加载是通过类加载器来完成的,链接包括验证、准备和解析三个阶段,初始化是由JVM来完成的,负责执行类的静态变量赋值和静态代码块中的代码。最后,当类不再被使用时,可以由JVM自动将其卸载。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。