垃圾收集算法分类
一 標記清除算法 mark-sweep
標記對象的判定(可達性 gcroots)
不足: 1 效率問題 2 空間問題 : 標記清除之后會產生大量不連續的內存碎片, 空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時 ,無法找到足夠的連續內存而不得不提前觸發垃圾收集動作
二 復制算法(copying) 解決效率的問題
將可用的內存按容量分為大小相同的兩塊,每次只使用其中的一塊,當一塊用完了,就將還存活的對象復制到另外一塊上面,然后再把已使用過 的內存空間一次性清理掉,每次都只對半個區域進行內存回收,缺點是將內存縮小了一半!
現在的商業虛擬機都是采用這種算法來回收新生代:新生代98%的對象都是朝生夕死的, 并不需要按照1:1,所以eden空間盡量大,就有了新生代的 eden(8)和survivor(1),一塊較大的eden區和兩塊較小的survivor區(新生代)
hostspot虛擬機默認的eden和survivor區的大小比例是8:1 也就是每次新生代中可用的內存空間為整個新生代容量的90%(8+1),只有10%的內存會被浪費;
三 標記整理算法 (針對老年代,復制算法不適合,存活對象多)(mark_compact) 標記 --整理(移動到端) --清楚
四 分代收集算法 分代后 新生代存貨少 用復制 老年代存活高用標記整理
hostspot算法實現 可作為GCroots的節點對象主要在全局性的引用(常量或者類靜態屬性)與執行上下文, 為什么full GC時影響性能: 保證可達性一致性——一致性的意思是整個分析期間,整個系統看起來就像是被凍結在某個時間點上,不可以出現 分析過程中對象引用關系還在不斷變化的情況,該點不滿足的話,分析結果準確性就得不到滿足 stop the world
hotSpot使用一組稱為OopMap的數據結構來達到這個目的,在類加載完成的時候,hotSpot就把對象內什么偏移量上是什么類型的數據計算出來。在oopMap的協助下,hotSpot能快速且準確的完成GCRoots枚舉,
不足: 1 效率問題 2 空間問題 : 標記清除之后會產生大量不連續的內存碎片, 空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時 ,無法找到足夠的連續內存而不得不提前觸發垃圾收集動作
二 復制算法(copying) 解決效率的問題
將可用的內存按容量分為大小相同的兩塊,每次只使用其中的一塊,當一塊用完了,就將還存活的對象復制到另外一塊上面,然后再把已使用過 的內存空間一次性清理掉,每次都只對半個區域進行內存回收,缺點是將內存縮小了一半!
現在的商業虛擬機都是采用這種算法來回收新生代:新生代98%的對象都是朝生夕死的, 并不需要按照1:1,所以eden空間盡量大,就有了新生代的 eden(8)和survivor(1),一塊較大的eden區和兩塊較小的survivor區(新生代)
hostspot虛擬機默認的eden和survivor區的大小比例是8:1 也就是每次新生代中可用的內存空間為整個新生代容量的90%(8+1),只有10%的內存會被浪費;
三 標記整理算法 (針對老年代,復制算法不適合,存活對象多)(mark_compact) 標記 --整理(移動到端) --清楚
四 分代收集算法 分代后 新生代存貨少 用復制 老年代存活高用標記整理
hostspot算法實現 可作為GCroots的節點對象主要在全局性的引用(常量或者類靜態屬性)與執行上下文, 為什么full GC時影響性能: 保證可達性一致性——一致性的意思是整個分析期間,整個系統看起來就像是被凍結在某個時間點上,不可以出現 分析過程中對象引用關系還在不斷變化的情況,該點不滿足的話,分析結果準確性就得不到滿足 stop the world
hotSpot使用一組稱為OopMap的數據結構來達到這個目的,在類加載完成的時候,hotSpot就把對象內什么偏移量上是什么類型的數據計算出來。在oopMap的協助下,hotSpot能快速且準確的完成GCRoots枚舉,
總結