1. JVM組成
1.1 JVM由哪些部分組成?運行流程?
難易程度:☆☆☆ 出現頻率:☆☆☆☆
- Java Virtual Machine:Java 虛擬機,Java程序的運行環境(java二進制字節碼的運行環境)
- 好處:一次編寫,到處運行;自動內存管理,垃圾回收機制
程序運行之前,需要先通過編譯器將 Java 源代碼文件編譯成 Java 字節碼文件;
程序運行時,JVM 會對字節碼文件進行逐行解釋,翻譯成機器碼指令,并交給對應的操作系統去執行。
好處:一次編寫,到處運行;自動內存管理,垃圾回收機制
JVM <---> 操作系統(windows、linux)<---> 計算機硬件(cpu、內存條)
java跨平臺是因JVM屏蔽了操作系統的差異,真正運行代碼的不是操作系統
JVM 主要由四個部分組成: 運行流程:
Java 編譯器(javac)將 Java 代碼轉換為字節碼(.class 文件)1. 類加載器(ClassLoader)
- 負責加載 .class 文件,將 Java 字節碼加載到內存中,并交給 JVM 執行
2. 運行時數據區(Runtime Data Area)
管理JVM使用的內存。主要包括:
方法區(Method Area):存儲類的元數據、常量、靜態變量等。
堆(Heap):存儲所有對象和數組,垃圾回收器主要回收堆中的對象。
棧(Stack):每個線程都有一個棧,用于存儲局部變量、方法調用等信息。
程序計數器(PC Register):每個線程有一個程序計數器,指示當前線程正在執行的字節碼指令地址。
本地方法棧(Native Method Stack):支持本地方法的調用(通過 JNI)。
其中方法區
和堆
是線程共享的,虛擬機棧
、本地方法棧
和程序計數器
是線程私有的。3. 執行引擎(Execution Engine)
- 負責執行字節碼,包含:
解釋器:逐條解釋執行字節碼。
JIT 編譯器:將熱點代碼編譯為機器碼,提高執行效率。
垃圾回收器:回收堆中的不再使用的對象,釋放內存。
4. 本地庫接口(Native Method Library)
- 允許 Java 程序通過 java本地接口JNI(Java Native Interface)調用本地方法(如 C/C++ 編寫的代碼),與底層系統或硬件交互。
1.2 什么是程序計數器?
難易程度:☆☆☆ 出現頻率:☆☆☆☆
- 程序計數器:線程私有的,每個線程一份,內部保存字節碼的行號。用于記錄正在執行的字節碼指令的地址。
- 每個線程都有自己的程序計數器,確保線程切換時能夠繼續執行未完成的任務。
1.3 你能給我詳細的介紹Java堆嗎?
難易程度:☆☆☆ 出現頻率:☆☆☆☆
- Java堆是 JVM 中用于存儲所有對象和數組的內存區域。線程共享的區域。當堆中沒有內存空間可分配給實例,也無法再擴展時,則拋出OutOfMemoryError異常。
它被分為:
- 年輕代(存儲新創建的對象),被劃分為三部分:
Eden區:大多數新對象的分配區域;
S0 和 S1(兩個大小嚴格相同的Survivor區):Eden 空間經過 GC 后存活下來的對象會被移到其中一個 Survivor 區域;- 老年代:在經過幾次垃圾收集后,任然存活于Survivor的對象將被移動到老年代區間。
- 永久代:JDK 7 及之前,JVM 的方法區(也稱永久代),保存的類信息、靜態變量、常量、編譯后的代碼;
元空間:JDK 8 及之后,永久代被 Metaspace(元空間)取代,移除了永久代,把數據存儲到了本地內存的元空間中,且其大小不再受 JVM 堆的限制,防止內存溢出。
1.4 什么是虛擬機棧
難易程度:☆☆☆ 出現頻率:☆☆☆☆
Java Virtual machine Stacks (java 虛擬機棧)
每個線程在 JVM 中私有的一塊內存區域,稱為虛擬機棧,先進后出,用于存儲方法的局部變量和方法調用信息;
每個棧由多個棧幀(frame)組成,當線程執行方法時,為該方法分配一個棧幀(Stack Frame);
每個線程只能有一個活動棧幀,對應著當前正在執行的那個方法;
垃圾回收是否涉及棧內存?
- 垃圾回收主要指就是堆內存,
- 棧內存中不會有垃圾回收的概念,因為棧內存是由 JVM 自動管理的,方法執行完成時,棧幀彈棧,內存就會釋放;
棧內存分配越大越好嗎?