2012年7月11日 星期三

筆記:JVM 的記憶體管理

JVM 規範的記憶體空間結構如下圖:

註:圖片轉載自 [2]

Heap
Heap 用來儲存物件的實例以及陣列值,可以視為所有用 new 關鍵字建立的物件,記憶體都會分配在 Heap 區域中。
Heap 預設的最小值是實體記憶體的 1/64,但小於 1GB;最大值是實體記憶體的 1/4,但小於 1GB。
最大值可以透過 -Xmx 參數來設定;最小值則透過 -Xms 設定。

當 JVM 目前的 Heap 空間使用率超過 60% 時,JVM 會自動增加 Heap 的空間;
而當使用率低於 40% 時,JVM 會自動減少 Heap 的空間。
要改變比例的話,可以透過 -XX:MinHeapFreeRatio、-XX:MaxHeapFreeRatio 改變比例
要注意的是參數是用閒置比例來計算的,因此假設 MinHeapFreeRatio 設定為 30% 的話
是表示閒置記憶體低於 30%,亦即記憶體使用率超過 70%,JVM 會增加 Heap 的記憶體空間。

在 Java 1.2 版以後,為了提昇 Heap 記憶體的使用效率,JVM 使用了分代管理(Generations)的機制來管理 Heap 記憶體空間,即將 Heap 分成三個世代,如下圖。



註:圖片轉載自 [6]

(1) 新生代(Young Generation)

(2) 舊生代(Old Generation)

(3) 方法區(Permanent Generation)
方法區存放類別的資訊(名稱、修飾符)、靜態變數、常數(定義為 final 的變數)等等。
Permanent Generation 在一定條件下會被 GC,但一般狀況下 GC 不會影響到 Permanent Generation。
而且根據 [6] 的描述,看起來官方似乎也不建議 GC 方法區的樣子?(不太確定,其實官方也只是用詞看起來不太建議,但並沒有明說 XD)
根據 [3] 回應的描述,Permanent Generation 當中會存放 class 對應到 Heap 裡的位置,如下圖。



註:圖片轉載自 [4]

在 JVM 當中可以透過 -XX:PermSize 及 -XX:MaxPermSize 來指定大小,預設最小值為 16MB、最大值為 64MB。


參考資料:
1、[書目] Java 分散式處理實務精要:奠定雲端基礎的 63 個思考術
2、JVM内存模型
3、In Java is Permanent Generation space garbage collected?
4、Presenting the Permanent Generation
5、Pick up performance with generational garbage collection
6、Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1

JVM学习总结(转载)

沒有留言: