1、概述
Java类加载进程是Java虚拟机(JVM)将.class文件中的字节码装载到内存中,并对字节码进行验证、预备和初始化的进程。这个进程涉及到了Java虚拟机的类加载器、运转时数据区等多个方面,其中包含了许多的细节和技术问题。
- 类加载器
Java虚拟机的类加载进程是由类加载器(ClassLoader)来完结的。类加载器担任将类装载到内存中,并为其创建一个Class目标。Java虚拟机界说了三品种加载器,分别为Bootstrap ClassLoader、Extension ClassLoader、System ClassLoader,它们依照层次关系进行安排,并且每个类加载器都有自己独立的命名空间,保证了不同类加载器之间的隔离性。
2. 加载阶段
类加载进程的第一阶段是加载(Loading),即经过类加载器读取.class文件中的二进制字节流,并将其转换成Java虚拟机中的Class目标。在这个阶段,Java虚拟机将会检查类文件的格局、语义等内容,保证其契合Java标准,否则将抛出ClassFormatError等异常。
3. 验证阶段
在加载完结后,Java虚拟机会对类进行验证(Verification),以保证它的字节码是正确、安全且契合标准的。这个阶段主要有四种验证方式:文件格局验证、元数据验证、字节码验证和符号引证验证。
4. 预备阶段
在验证经过后,Java虚拟机会为类分配内存空间,并进行默许初始化(Prepare),行将类变量分配内存并初始化为二进制零值。这个进程中不会涉及任何Java代码履行,只是简单地为类变量赋予一些初始值。
5. 解析阶段
解析(Resolution)是Java虚拟机将符号引证替换为直接引证的进程。在Java程序中,调用办法或拜访目标时一般运用符号引证,需求在运转时将其解析成直接引证才能履行相应的操作。
6. 初始化阶段
当类被加载并初始化后,Java虚拟机会履行其静态初始化器(clinit)中的Java代码。静态初始化器包含了对类中所有静态变量进行赋值操作的Java代码块,它们依照类界说时的次序顺次履行。如果在静态初始化器中产生异常,则该类将被视为无法正确初始化,不允许被运用。
类加载进程总结
Java类加载进程是一个杂乱的进程,它涉及到类加载器、运转时数据区等多个方面,并且在不同的阶段都需求完结各种任务,如文件格局验证、元数据验证、符号引证解析等。了解这些进程可以帮助Java开发者更好地理解Java虚拟机的内部完结机制,从而编写出更加高效和优秀的Java代码。
2、相关问题
Q: 什么是类加载?
A: 类加载是将Java字节码文件加载到JVM中,并在运转期间动态生成Java类的进程。
Q: Java中有哪些类加载器?
A: Java中有三品种加载器:Bootstrap ClassLoader()、Extension ClassLoader和Application ClassLoader。
1)Bootstrap ClassLoader(启动类加载器):由C++编写,担任加载Java运转环境(JRE)中心库,例如java.lang包等。它是JVM的内置类加载器,在JVM启动时就会被初始化。
2)Extension ClassLoader(扩展类加载器):用来加载Java扩展库,坐落JRE的/lib/ext目录下,或许经过java.ext.dirs体系变量指定的其他目录中。
3)Application ClassLoader(应用程序类加载器):用来加载应用程序途径上的类,也称为体系类加载器。它是ClassLoader类的子类,一般是由Java应用程序创建的默许类加载器。
Q: 类加载的进程包含哪些过程?
A: 类加载的进程包含加载、验证、预备、解析和初始化五个过程。
Q: 类加载器的双亲委派模型是什么?
A: 类加载器的双亲委派模型是指当一个类加载器需求加载一个类时,它首要会将这个任务委托给它的父类加载器去完结,如果父类加载器无法加载,则再由自己来测验加载。
Q: 什么是类加载器的命名空间?
A: 类加载器的命名空间是指每个类加载器所加载的类都具有独立的命名空间,相同名称的类可以存在于不同的命名空间中。
Q: 怎么打破类加载器的双亲委派模型?
A: 可以运用线程上下文类加载器(Thread Context ClassLoader)来打破类加载器的双亲委派模型。
Q: 类加载器的缓存机制是什么?
A: 类加载器的缓存机制是指当一个类被某个类加载器加载后,该类及其依赖的类将被缓存到该类加载器中,以供后续运用。
Q: 怎么自界说类加载器?
A: 可以经过继承ClassLoader类并重写findClass()办法来自界说类加载器。一般情况下,自界说类加载器会从指定的途径或许网络地址上加载字节码文件。
Q: 什么是热布置(HotSwap)?怎样完结Java代码的热布置?
A: 热布置是指在不中止Java应用程序的情况下,动态地替换或更新Java类或资源文件。完结Java代码的热布置可以运用一些东西,如JRebel、DCEVM等。这些东西一般经过改动类加载器的行为,使得修改后的Java类可以被重新加载到JVM中。
=========================================
怎么文章对你有帮助,不要忘掉加个关注、点个赞!!!