標記清除
1.標記清除算法分為標記
和清除
兩個階段,首先通過可達性分析,標出所有需要回收的對象,然后回收統一需要回收的對象。
2.缺陷:一個是效率問題,標記和清除過程效率不高,另外一個是清除后會造成大量的碎片空間,有可能會造成在申請大塊內存的時候沒有足夠的連續空間導致再次GC。
復制算法
1.為了解決碎片空間問題,出現了復制算法
。復制算法的原理是將內存分為兩塊,每次申請內存時都使用其中的一塊,當內存不夠時將這一塊內存所存活的對象復制到另一塊上,然后將已使用的內存空間整個清除掉。
2.缺陷:復制算法解決了空間碎片問題,也帶來了新的問題。因為每次在申請內存時,都只能使用其中的一半內存空間,內存利用率嚴重不足。
3.JVM中新生代采用的就是復制算法進行GC,針對內存利用率不足問題做了一些優化。IBM公司的專門研究表明,新生代中的對象 98% 是“朝生夕死”的,意思是說,在新生代中,經過一次 GC 之后能夠存活下來的對象僅有 2% 左右。所以并不需要按照1:1的比例劃分出兩塊內存空間,而是將內存分成三塊,一塊較大的Eden區,和兩塊較小的Survivor區。其中Eden區占80%內存,兩塊Survivor各占10%的內存。在創建新的對象時,只使用Eden區和其中的一塊Survivor區,當進行GC時,把Eden區和Survivor區存活的對象全部復制到另一塊Survivor區,然后清理掉Eden區和已使用的Survivor區。這種內存劃分方式解決了內存利用率問題,在每次創建對象時,可用內存為90%(80%+10%)當前內存容量。
標記整理
1.復制算法在GC后存活對象較少的情況下效率比較高,但如果存活的對象比較多,會執行較多的復制操作,效率就會下降。而老年代的對象在GC之后存活率就比較高,所以就有了標記整理算法
。
2.標記整理算法標記
過程與標記清除算法
的標記過程一樣,但標記之后不會進行直接清理,而是將所有存活的對象都移動到內存的一端,移動結束后直接清理掉剩余的部分。
分代收集
1.分代收集是將內存劃分為新生代和老年代,分配的依據是對象的生存周期,或者說是經歷過的GC次數。對象創建時,一般在新生代申請內存,當經歷過一次GC之后如果對象還存活著,那么對象年齡+1,當年齡超過一定的值(默認值時15,可通過參數-XX:MaxTenuringThreshold來設定),如果對象還存活,那么該對象會進入老年代。