JVM加载class文件的原理机制实例详解
什么是JVM
Java虚拟机(Jvm)是一款能够执行Java字节码的虚拟机。它是Java的核心,Java程序需要在JVM环境下运行。
JVM的主要功能包括解释Java代码、JIT编译器、内存管理、垃圾回收等。其中,JVM中的类加载器负责将class文件加载到JVM内存中。
JVM加载class文件的过程
JVM加载class文件的过程可以分为三步骤:加载、连接和初始化。
1. 加载
类加载器在类路径上搜索class文件,并通过IO输入流读取class文件,然后对该文件进行解析,并且在内存中生成一个代表这个类的Class对象。
2. 连接
连接又分为三个阶段:
2.1 验证
因为class文件可以手写或者被恶意篡改,这阶段就是对class文件进行验证。验证阶段包括语法分析、字节码验证、符号引用验证等。
2.2 准备
在准备阶段,JVM为类变量分配内存,设置默认初始化值。
2.3 解析
解析阶段就是将类中的符号引用转换成直接引用的过程。符号引用就是以字符串形式表示的一组符号,可以是类或接口的全限定名,字段的名称和描述符,方法的名称和描述符。
3. 初始化
在初始化阶段,JVM执行类的初始化代码,包括执行类构造器方法<clinit>
,为静态变量赋初始值。
示例1
现在我们创建一个简单的Java类HelloWorld,然后通过以下命令编译为class文件:javac HelloWorld.java
。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
然后使用命令java HelloWorld
来运行这个程序,JVM就会加载并执行这个类。
示例2
我们再创建一个Java类MyClass,并在这个类中引用一个尚未定义的类com.abc.Test
。
public class MyClass {
public static void main(String[] args) {
Test test = new Test();
System.out.println("MyClass");
}
}
然后编译这个类,并把MyClass.class放到classpath中,运行结果会报错,错误信息为:java.lang.NoClassDefFoundError: com/abc/Test
。
这是因为在验证阶段,JVM发现了一个类引用无法解析,因为Test类还没有被定义,所以在连接过程中就失败了。
结论
JVM的类加载机制保证了Java程序的灵活性和可移植性。不同的类加载器可以根据需要加载不同位置的class文件,这为Java程序提供了更多的灵活性,并且也使得Java程序可以跨平台运行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JVM加载class文件的原理机制实例详解 - Python技术站