※ 引述《ireullin (raison detre)》之銘言:
: 抱歉
: 我想釐清一下我的問題
: 所以如果問了奇怪的東西請大家多多包涵
: 謝謝網友提供的圖
: http://imgur.com/Jm0gPUe
: 不知道這張圖的出處是在?
: 是否還有其他資訊可參考?
: 所以 serial, ParNew, Parallel Scavenge
: 主要是負責young generation
: 而CMS, Parallel Old, Serial Old
: 負責Tenured generation?
: 是指這樣嗎
對
: 然後JVM其實底下有多個GC在運作?
: 只是何時會觸發那一個GC
: 並不是我們能決定的?
: 若沒有特別去關閉或開啟哪個GC
: 則是由JVM自行去決定
: 是這樣嗎?
: 我們是否可以得知目前JVM有使用哪幾個GC?
在沒有任何配置的情況下,
JVM 會依據版本以及系統資源決定所使用的 GC 演算法,
e.g. 32-bit JVM 或者是單核心的系統預設使用單緒演算法;
64-bit JVM 預設使用多緒演算法... etc
young/tenured generation 各自只會有一個 GC 演算法的設定,
不是在執行時間讓 JVM 去決定的...
如我之前的回文,
你若要確認目前 JVM 所啟用的 GC 演算法, 可以透過 GC Log 或者是 JConsole
: servivor這記憶體有兩塊
: 用意是?
: GC演算法中有提到一個 copying algorithm
: 是否是這邊採用的?
: 所以其他部分都只有使用mark-sweep與mark-compact?
Young gen GC 動作就是在 eden 跟 S0 空間中找出尚有參照的物件,
複製到 S1 之後把 eden 跟 S0 清空;
下一個 minor GC 循環則是在 eden 跟 S1 空間中找出尚有參照的物件,
複製到 S0 之後把 eden 跟 S1 清空;
這個複製循環會增加物件的 "歲數",
到達一定的歲數後則是移到 tenured gen...
Survivor space 主要的目的就是為了速度,
記憶體空間的互相複製相當的快,
而且也不需要進行 compaction
: 有網友推薦
: 直達 Java 虛擬機器-JVM 進階與應用
: 這本我已經在看了
: 可能我沒有讀透
: 其實我這些問題是從這裡頭衍生出來的
: 再請大家賜教了