Java 從基礎到精通 — 第 9 講
了解 JVM 記憶體、GC 和 JIT 的作用
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
Java 程式碼運行在 JVM 之上,並在運行時的幫助下處理類別載入、記憶體管理和執行最佳化。 重要的是要了解此過程如何影響效能和錯誤,而不是記住內部術語。
類別載入和字節碼
Source.java
↓ compiler
Source.class
↓ class loader
JVM execution
類別載入器找到所需的類別並驗證它是否是 JVM 可以使用的形式。 如果類別路徑或依賴項不匹配,即使編譯成功,在執行過程中也可能找不到該類別。
堆疊和堆積
方法呼叫資訊和局部變數在每個執行緒的呼叫幀中管理。 可以從多個地方引用的物件是在託管堆區域中建立的。
void update() {
int damage = 10;
Monster monster = new Monster();
monster.takeDamage(damage);
}
Damage 是一個原始型別值, Monster 變數是物件參考。 實際的放置和最佳化是由JVM實作決定的,所以所有的物件位置不應該用簡單的公式來判斷。
Garbage Collector
無法再存取的物件將受到 GC 收集。 有GC並不意味著永遠不會出現記憶體洩漏。
如果靜態集合或事件偵聽器繼續引用未使用的對象,則它仍然可存取。 文件、套接字等外部資源應直接關閉,無需等待 GC。
即時最佳化
JVM 可以透過觀察執行過程中頻繁使用的程式碼並將其編譯成機器語言來最佳化程式碼。 僅從很短的執行時間來判斷整體效能可能會混淆準備和最佳化。
對於效能問題,在更改堆大小或 GC 選項之前,應使用分析器測量配額、CPU 使用率和鎖定等待。 JVM知識是解釋測量結果原因的基礎,而不是推測性的微觀優化。