Sun的JVM將整個堆分為三代:YoungGen(新生代),OldGen(年老代),和PermGen(持久區):
Minor GC:通常是指對新生代的回收。
Major GC:通常是指對年老代的回收。
Full GC:Major GC除并發gc外均需對整個堆進行掃描和回收。
復制拷貝算法:要拷貝大量數據,不會產生碎片。
標記算法:從引用根節點開始標記所有被引用的對象,把未被引用的對象清除。要遍歷所有對象,會產生碎片。
young 又分為eden,survivor1(from space ),survivor2(to sapce ).youngGen區里面的對象的生命周期比較短,gc對這些對象進行回收的時候采用復制拷貝算法。
eden 每當一個對象創建的時候分配的這個區域。當eden無法分配時,觸發一次Minor gc。gc每次回收的時候都將eden區存活的對象和survivor1中的對象拷貝到survivor2中,eden和survivor1清空;當gc執行下次回收的時候將eden和survivor2中的對象拷貝到surivor1中,清空eden和survivor2。依次這樣執行;經過數次回收將依然存活的對象復制到OldGen區。
OldGen 當對象從年輕代晉升到老年代之前,會檢測老年區的剩余空間是否大于要晉升對象的大小,如果小于則直接進行一次Full GC,以便讓老年去騰出更多的空間,然后再進行Minor GC,把年輕代的對象復制到老年代;如果大于,則根據條件(HandlePromotionFailure設置)進行Minor GC 和 Full GC。
老年區采用標記算法,因為老年區對象的生命周期都是比較長的,采用拷貝算法要拷貝大量的數據。采用標記算法每次gc回收都要遍歷所有的對象。
PermGen 主要存放加載進來的類信息,包括方法,屬性,常量池等,滿了之后可能會引起out of memory 錯誤。
JVM YoungGen(新生代),OldGen(年老代),和PermGen(持久區)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 垃圾回收算法具體實現 翻譯原文 => plumbr Java GC handbook 前文參見: Java垃圾回收...