2009年2月21日星期六

Java Garbage Collection Setting

http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#resources
http://www.strongd.net/blog/show/481

自己理解:
Java 的 memory heap 分為幾個區域,它們分別是 New Generation (N區) 、 Tenured Generation(T區) 和 Permanent Generation(P區)。而 N區 之中,又分為 Eden和 Survivor。

一隻 object 的生命週期如下:
新的 object 首先在 Eden 區誕生,當 Eden區被填滿時,會進行N區的 GC,經過第一次 N區的 GC(Minor Collection) 後,如果它仍然生存下來,會被複製去Survivor 區。Survivor 區半滿之後,區內最年長的 object 會進入 T區。T區出現 GC 的情況理論上應該較低,而每次 GC 也會是一個 Full GC,這會造成整個JVM停頓一段長時間,直至 Full GC 完成。每次 GC 完成後,牽涉的區域都會根據生存的object佔用情況來修改該區的 total heap size,以維持適當的physical memory usage。

這些過程之中,有不少地方可以做 tuning。例如 New Generation 和 Old Generation 的比例、Eden 和 Survivor 的比例和 Heap Size 的調整策略等。


關於 Garbage Collection:
首先, JVM 的 GC 策略是基於一個假設,就是大多數 object 都是短命的。基於這個假設, JVM 的 heap 分成了兩個區域, N區 和 O區, New 之中的 object 都是年輕的,而 Old 之中的則已經生存了一段時間。

在 N 區,使用的策略是 Copying Collector,就是把仍然 traceable 的 object 從 New Generation區 (包括 Eden 和 上一次使用的Survior區) 複製到空的 Survivor 區裏。然後清空 New Generation。這個策略是非常發速並且高效的。第一,一些長時間生存的 object 已經不在 N區中存在,所以基本上,大部份 N區的 object 都會被 GC,要被 copy 的 object只是少數。第二,由於survivor可以肯定是空的,所以每次複製都會順帶作出compact的動作。
意義:N區越大,GC的頻率會越少,而所需時間則會越長。

當 Survivor 區被填充了超過一半的情況下,最年長的 object 會被複製去 T區以維持 Survivor 區在半滿的狀態。
意義:Survivor 區越大的話,浪費的空間越大,因為應該有1.5個 Survivor 的區域長期空置,而object 停留在 N區的時間會越長;相反,區域越小的話,每次 GC 都會把大量短命的 object 送到 T區,令到 出現 Full GC 的頻率增加。


T區並沒有自己的GC方法,而是每次被填滿的時候,整個 heap 都會參與 GC ,那麼所需時間都會相應大增。


P區儲存的是 class相關 的資訊,凡是經 class loader load 過的class都會放進此區域,我相信 static final 的 object 亦會被放進 P區內,而 P區好像是不會進行 GC 的。

沒有留言: