GC是分代收集算法,頻繁收集Young區,較少收集Old區,基本不動Perm區 ,JVM在進行GC時,并非每次都對上面三個內存區域一起回收的,大部分時候回收的都是指新生代。
因此GC按照回 收的區域又分了兩種類型,一種是普通GC(minor GC),一種是全局GC(major GC or Full GC), 普通 GC(minor GC):只針對新生代區域的GC。 全局GC(major GC or Full GC):針對年老代的GC,偶爾伴隨對 新生代的GC以及對永久代的GC。
GC常用算法 1.引用計數法(了解) 2.復制算法(Copying) 3.標記清除(Mark-Sweep) 4.標記壓縮(Mark-Compact) 5.標記清除壓縮(Mark-Sweep-Compact)
算法沒有最好的,只能找最合適的,我們使用的是分代收集算法(相對聯合的應用)
年輕代(Young Gen)
年輕代特點是區域相對老年代較小,對像存活率低。
這種情況復制算法的回收整理,速度是最快的。復制算法的效率只和當前存活對像大小有關,因而很適用于年輕代 的回收。而復制算法內存利用率不高的問題,通過hotspot中的兩個survivor的設計得到緩解。
老年代(Tenure Gen)
老年代的特點是區域較大,對像存活率高。這種情況,存在大量存活率高的對像,復制算法明顯變得不合適。一般是由標記清除或者是標記清除與標記整理的混合實現。
Mark階段的開銷與存活對像的數量成正比,這點上說來,對于老年代,標記清除或者標記整理有一些不符,但可以通過多核/線程利用,對并發、并行的形式提標記效率。
Sweep階段的開銷與所管理區域的大小形正相關,但Sweep“就地處決”的特點,回收的過程沒有對像的移動。使其相對其它有對像移動步驟的回收算法,仍然是效率最好的。但是需要解決內存碎片問題。
Compact階段的開銷與存活對像的數據成開比,如上一條所描述,對于大量對像的移動是很大開銷的,做為老年代 的第一選擇并不合適。
基于上面的考慮,老年代一般是由標記清除或者是標記清除與標記整理的混合實現。以hotspot中的CMS回收器為 例,CMS是基于Mark-Sweep實現的,對于對像的回收效率很高,而對于碎片問題,CMS采用基于Mark-Compact 算法的Serial Old回收器做為補償措施:當內存回收不佳(碎片導致的Concurrent ModeFailure時),將采用 Serial Old執行Full GC以達到對老年代內存的整理。