Java虚拟机(JVM)执行的文件是经过编译生成的.class字节码文件。这些字节码文件是Java源代码文件(.java)通过Java编译器(如javac)编译后生成的中间表示形式,它是一种硬件和操作系统无关的二进制格式,存储了类的结构信息、方法信息以及字段信息等。
在Java程序的执行过程中,JVM并不直接运行.java源代码文件,而是加载并执行.class字节码文件。具体来说,JVM的工作流程如下:
编译阶段:Java源代码文件(.java)首先被编译器(如javac)编译成.class字节码文件。这个字节码文件包含了程序的抽象指令集,以及类的结构信息,例如类名、方法名、变量名等。
加载阶段:JVM通过类加载器(ClassLoader)将.class文件加载到内存中。加载阶段包括定位.class文件、验证其合法性以及将字节码存储到运行时数据区的方法区中。
验证阶段:JVM对加载的字节码进行一系列检查,确保其符合Java语言规范,包括语法正确性、类型安全性和安全性等。
准备和解析阶段:JVM为类变量分配内存并设置默认值,并解析符号引用,将其转换为直接引用。
初始化阶段:JVM执行类构造器<clinit>()方法,完成类变量的初始化。
执行阶段:JVM通过执行引擎(Execution Engine)解释或即时编译(JIT Compiler)字节码,将其转换为特定平台的机器码并执行。执行过程中,JVM会管理程序运行时的数据区域,包括堆(Heap)、栈(Stack)、方法区(Metaspace)等。
卸载阶段:当类不再被需要时,JVM会卸载该类的字节码文件。
需要注意的是,虽然JVM执行的是.class字节码文件,但也可以通过jar文件运行Java程序。jar文件是一种压缩格式的文件,可以包含多个.class文件以及其他资源文件。在运行jar文件时,JVM会从classpath中找到所需的.class文件并加载执行。
Java虚拟机执行的核心是.class字节码文件,它作为Java程序的中间表示形式,使得Java程序能够在任何支持JVM的平台上运行,真正实现了“一次编写,到处运行”的理念。