垃圾回收器
一、垃圾回收器
????????1.Serial 年輕代 串行回收器,采用的是復制回收算法 ,單線程的
????????2.PS(Parallel Scavenge) 年輕代 并行回收器,采用的是復制回收算法,多線程的
????????3.ParNew 年輕代,配合CMS的并行回收,采用的是復制回收算法,多線程的
????????4.Serial Old 老年代,串行回收器,采用的是標記整理回收算法,單線程的
????????5.Parallel Old 老年代,并行回收器,采用的是標記整理回收算法,多線程的
????????6.CMS 老年代 并發回收器,采用標記清除回收算法,多線程
????????7.G1 分代收集器,但整個內存分區不存在物理上的年輕代與老年代的區別
????????8.ZGC
STW(stop the world): 編譯代碼時為每一個方法注入safepoint(方法中循環結束的點、方法執行結束的點), 在暫停應用時,需要等待所有的用戶線程進入safepoint,之后暫停所有線程, 然后進行垃圾回收。二、查看jvm垃圾回收器
查看JVM默認的垃圾回收器
cmd命令:
java -XX:+PrintCommandLineFlags -version結果:
jdk 1.7 1.8 默認 UseParallelGC = PS + PO 【Parallel Scavenge + Parallel Old】
三、垃圾回收器跟內存大小優化
1. serial 幾十兆
2.PS 上百兆 - 幾個G
3.CMS - 20G
4.G1 - 上百G
5.ZGC - 4T-16T
四、常見的垃圾回收器組合
五、CMS和G1的比較
CMS:
????????采用多線程實現"標記-清除"算法
算法原理:
????????1.初始標記:需要STW,只標記GC Roots能直接關聯到的對象。
????????2.并發標記:遍歷之前標記到的關聯節點, 80%的時間都耗在這里
????????3.重新標記:需要STW,修正并發標記期間,因用戶程序繼續運行導致標記產生變動的那一部分對象的標記記錄。
????????4.并發清除:并發清除可以和用戶線程一起運行,所以總體上停頓的時間非常短。 會產生浮動垃圾
缺點:
????????1.對CPU資源敏感。
????????2.無法處理浮動垃圾。
????????3.收集結束后會產生大量碎片。
里程碑的垃圾回收器,jdk1.4版本后期引入
????????因此目前任何一個JDK版本默認是CMS 并發垃圾回收是因為無法忍受STW(Stop-The-World)
????????單碎片化嚴重的時候,就會清除老奶奶出來,Serial Old,拿一個掃把一個一個掃,一個老奶奶拿個掃帚掃天安門廣場,那多慢。
FGC 是老年代空間不足的時候觸發,默認使用垃圾回收器是PS+PO,
G1:
三色標記+SATB;
算法原理:
- G1收集器將整個堆劃分為多個大小相等的區域
- G1跟蹤各個區域里面的垃圾堆積的價值,在后臺維護一張優先列表,每次根據允許的收集時間,優先回收價值最大的區域,這種思路:在指定的時間內,掃描部分最有價值的region(而不是掃描整個堆內存),并回收,做到盡可能的在有限的時間內獲取盡可能高的收集效率。
運作流程:
- 初始標記:標記出所有與根節點直接關聯引用對象。需要STW
- 并發標記:遍歷之前標記到的關聯節點,繼續向下標記所有存活節點。在此期間所有變化引用關系的對象,都會被記錄在Remember Set Logs中
- 最終標記:標記在并發標記期間,新產生的垃圾。需要STW
- 篩選回收:根據用戶指定的期望回收時間回收價值較大的對象(看"原理"第二條)。需要STW
優點:
- 由于只回收部分region,所以STW時間我們可控,所以不需要與用戶線程并發爭搶CPU資源,而CMS并發清理需要占據一部分的CPU,會降低吞吐量。
- 由于STW,所以不會產生"浮動垃圾"(即CMS在并發清理階段產生的無法回收的垃圾)
總結:
1、CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用;
2、G1收集器收集范圍是老年代和新生代,不需要結合其他收集器使用;
3、CMS收集器以最小的停頓時間為目標的收集器;
4、G1收集器可預測垃圾回收的停頓時間
5、CMS收集器是使用“標記-清除”算法進行的垃圾回收,容易產生內存碎片
6、G1收集器使用的是“標記-整理”算法,進行了空間整合,降低了內存空間碎片。
7.雖然G1的響應時間比CMS快,G1的吞吐量要比CMS少15%左右
六、垃圾收集器常用參數
-XX:+UseSerialGC = Serial New (DefNew) + Serial Old
小型程序。默認情況下不會是這種選項
-XX:+UseParNewGC = ParNew + SerialOld
這個組合已經很少用(在某些版本中已經廢棄)
-XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old
-XX:+UseParallelGC = Parallel Scavenge + Parallel Old
(1.8默認) 【PS + SerialOld】
-XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old
-XX:+UseG1GC = G1
總結
- 上一篇: 2022.5.23-5.29 AI行业周
- 下一篇: win10 android fastbo