1、JVM虛擬機的簡介
Java 虛擬機(Java Virtual Machine 簡稱:JVM)是運行所有 Java 程序的抽象計算機,是 Java 語言的運行環境,實現了 Java 程序的跨平臺特性。JVM 屏蔽了與具體操作系統平臺相關的信息,使得 Java 程序只需生成在 JVM 上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行?。
1.1 JVM 的基本組成
JVM 主要由以下幾個部分組成:
- 類加載器?:負責將 .class 文件加載到內存中。
- ?執行引擎?:負責解釋執行字節碼或通過即時編譯(JIT)將其轉換為機器碼。
- ?運行時數據區?:包括堆、棧、方法區和程序計數器等,用于存儲程序運行時的數據和狀態。
- ?本地接口?:用于融合不同的編程語言,雖然使用較少,但在需要與硬件交互時仍然重要?。
1.2 JVM 的運行流程
- 編譯?:Java 源代碼通過 javac 編譯器編譯成字節碼(.class文件)。
- ?類加載?:類加載器將字節碼文件加載到 JVM 的內存中。
- ?執行?:執行引擎解釋或編譯字節碼,并提交操作系統執行。
- ?垃圾回收?:自動管理內存,防止內存泄漏和溢出?。
1.3 JVM 的跨平臺特性
JVM 的跨平臺特性使得 Java 程序可以在任何支持 JVM 的操作系統上運行,實現了“一次編寫,到處運行”(Write Once, Run Anywhere, WORA)的目標。這是通過 JVM 屏蔽底層硬件和操作系統的差異,提供統一的字節碼規范來實現的?。
2、JVM 的內存結構
JVM 在執行 Java 程序的時候,為了便于管理,會把它所管理的內存劃分為多個不同區域。
JVM 的內存結果如下圖:
2.1 字節碼文件(class 文件)
字節碼文件(class 文件)是 Java 程序編譯后生成的中間代碼,這些中間代碼將會被 JVM 解析并執行。字節碼文件是 Java 源代碼(.java)編譯后生成的中間代碼文件(.class),采用二進制格式存儲,包含 JVM 可執行的指令集。與機器碼不同,字節碼是平臺無關的中間表示,需由 JVM 解釋或即時編譯(JIT)為機器碼執行。
2.2 類加載器(ClassLoader)
類加載器子系統負責把 class 文件轉載到內存中,供虛擬機執行。
2.3 方法區(Method Area)
方法區用來存儲被虛擬機加載的類信息、常量、靜態變量、編譯器編譯后的代碼等數據。在類加載器加載 class 文件的時候,這些信息將會被提起出來,并存儲到方法區中。由于這個區域是所有線程共享的區域,因此,它被設計為線程安全的。方法區可以被看出 JVM 的一個規范,在 HotSpor 中,方法區是用 Perm 區來實現的方法區。
2.4 ?堆(Heap)
堆是虛擬機啟動的時候創建的被所有線程共享的區域。這塊區域只要用來存儲對象的實例,通過 new 操作創建出來的對象的實例都存儲在堆空間中,因此,堆就成為垃圾回收器管理的重點區域。
2.5 程序計數器(Program Counter Register)
程序計數器用于記錄當前線程執行字節碼的指令地址(行號指示器&#x