Java虛擬機(JVM)執(zhí)行的文件是經過編譯生成的.class字節(jié)碼文件。這些字節(jié)碼文件是Java源代碼文件(.java)通過Java編譯器(如javac)編譯后生成的中間表示形式,它是一種硬件和操作系統(tǒng)無關的二進制格式,存儲了類的結構信息、方法信息以及字段信息等。
在Java程序的執(zhí)行過程中,JVM并不直接運行.java源代碼文件,而是加載并執(zhí)行.class字節(jié)碼文件。具體來說,JVM的工作流程如下:
編譯階段:Java源代碼文件(.java)首先被編譯器(如javac)編譯成.class字節(jié)碼文件。這個字節(jié)碼文件包含了程序的抽象指令集,以及類的結構信息,例如類名、方法名、變量名等。
加載階段:JVM通過類加載器(ClassLoader)將.class文件加載到內存中。加載階段包括定位.class文件、驗證其合法性以及將字節(jié)碼存儲到運行時數(shù)據(jù)區(qū)的方法區(qū)中。
驗證階段:JVM對加載的字節(jié)碼進行一系列檢查,確保其符合Java語言規(guī)范,包括語法正確性、類型安全性和安全性等。
準備和解析階段:JVM為類變量分配內存并設置默認值,并解析符號引用,將其轉換為直接引用。
初始化階段:JVM執(zhí)行類構造器<clinit>()方法,完成類變量的初始化。
執(zhí)行階段:JVM通過執(zhí)行引擎(Execution Engine)解釋或即時編譯(JIT Compiler)字節(jié)碼,將其轉換為特定平臺的機器碼并執(zhí)行。執(zhí)行過程中,JVM會管理程序運行時的數(shù)據(jù)區(qū)域,包括堆(Heap)、棧(Stack)、方法區(qū)(Metaspace)等。
卸載階段:當類不再被需要時,JVM會卸載該類的字節(jié)碼文件。
需要注意的是,雖然JVM執(zhí)行的是.class字節(jié)碼文件,但也可以通過jar文件運行Java程序。jar文件是一種壓縮格式的文件,可以包含多個.class文件以及其他資源文件。在運行jar文件時,JVM會從classpath中找到所需的.class文件并加載執(zhí)行。
Java虛擬機執(zhí)行的核心是.class字節(jié)碼文件,它作為Java程序的中間表示形式,使得Java程序能夠在任何支持JVM的平臺上運行,真正實現(xiàn)了“一次編寫,到處運行”的理念。