Java發展至今,已經推出了好幾代垃圾收集器,包括Serial、ParNew、Parallel、CMS、G1以及Java11中最新的ZGC,每一代GC都對前一代存在的問題做出了很大的改善。
新生代使用的垃圾收集器主要有:
Serial收集器:
1.單線程收集器,在單核CPU架構下,JDK3之前新生代的回收器的唯一選擇、
2.它與應用線程的執行是串行的,也就是說,執行應用線程的時候,不會執行GC,執行GC的時候,不能執行應用線程
ParNew收集器
1.就是serial回收器的多線程版本,有很多的代碼都是和serial收集器公用的
2.在進行回收的過程中仍然會暫停用戶線程(STW),然後利用多核CPU的能力,採用多線程方式進行垃圾回收
Parallel scavenge收集器
老年代:
老年代使用的垃圾收集器主要有:
1.Seria-old收集器
2.Parallel Old收集器
3.CMS收集器
Seria-old收集器
Parallel Old收集器
CMS收集器
1.CMS是HotSpot在JDK5推出的第一款真正意義上的併發(Concurrent)收集器,第一次實現了讓垃圾收集線程與用戶線程(基本上)同時工作
2.CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器
3.目前很大一部分的Java應用都集中在互聯網站或B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗
1.跟用戶線程競爭資源
2.在併發清除垃圾階段,由於用戶線程還在執行,要預留一定的空間給用戶線程進行使用,所以收集器一定不能在老年代已經佔用100%的情況下再進行垃圾收集(沒內存空間了)
3.因爲這個垃圾回收器是使用的標記-清除算法,所以會產生大量的內存碎片
CMS收集器的缺點的人工干預:
新一代垃圾回收器:G1(非常厲害)
1.空間整合:G1收集器採用標記-整理算法,不會產生內存空間碎片
2.它將整個Java堆劃分爲多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔閡了,它們都是一部分可以不連續Region的集合。紅色爲巨大的對象創建區域的。