JVM在進行GC時,並不是新生代、老年代一起進行,大部分都是在新生代中回收,GC又分爲Minor GC和Major GC。
Minor GC 和 Major GC 區別
Minor GC:
只針對新生代區域,指的是發生在新生代中的垃圾收集,由於大多數對象存活率不高,所有Minor GC非常頻繁,回收速度快。
Major GC: 指的是發生在老年代的垃圾收集,出現Major GC時,經常會伴隨至少一次的Minor GC。Major GC掃描空間較大,速度較慢。
GC四大算法
1.引用計數法(一般不使用):
使用該方法進行GC時,每個對象中會攜帶一個引用計數器,每當對象被引用就+1,結束引用就-1。直到對象的引用計數器爲0,說明該對象沒有被使用,回收對象。
缺點:每次對象賦值時需要維護引用計數器;較難處理循環引用。
2.複製算法(From、To):
複製算法在年輕代中使用,基本思想是將內存分成兩塊,每次只用其中一塊,當一塊內存用完,將活着的對象複製到另一個塊上。
優點:速度快,不會產生內存碎片。
缺點:消耗內存空間。
3.標記清除:
標記清除發生在老年代,分成標記和清楚兩個階段,先標記出需要回收的對象,然後統一進行回收。
優點:不需要額外空間。
缺點:兩次掃描,耗時,會產生內存碎片。
4.標記壓縮:
標記壓縮發生在老年代,一般是由標記清楚與標記整理混合實現。首先與標記清除相同, 回收後再次掃描,整理存活對象。
優點:不會產生內存碎片。
缺點:需要移動存活對象,消耗成本,耗時。
沒有最好的垃圾回收算法,只有最合適的,在不同代中使用不同垃圾回收算法,也稱分代收集算法。
內存效率:複製算法>標記清除算法>標記整理算法
內存整齊度:複製算法=標記整理算法>標記清除算法
內存利用率:標記整理算法=標記清除算法>複製算法