jvm gc知識

GC基礎知識

一、什麼是垃圾

沒有任何引用指向的一個對象或者多個對象(循環引用)

二、如何定位垃圾

  • 引用計數
  • 根可達算法

    三、常見的垃圾回收算法

  • 標記清除(mark sweep) - 位置不連續 產生碎片 效率偏低(兩遍掃描)
  • 拷貝算法 (copying) - 沒有碎片,浪費空間
  • 標記壓縮(mark compact) - 沒有碎片,效率偏低(兩遍掃描,指針須要調整)

四、JVM 內存分配模型

  • 部分垃圾回收器使用的模型算法

    • 除Epsilon ZGC Shenandoah以外的GC都是使用邏輯分代模型
    • G1是邏輯分代,物理不分代
    • 除此以外不只邏輯分代,並且物理分代
  • 新生代 + 老年代 + 永久代(1.7)Perm Generation/ 元數據區(1.8) Metaspace
    • 永久代 元數據 - Class
    • 久代必須指定大小限制 ,元數據能夠設置,也能夠不設置,無上限(受限於物理內存)
    • 字符串常量 1.7 - 永久代,1.8 - 堆
    • MethodArea邏輯概念 - 永久代、元數據
  • 新生代 = Eden + 2個suvivor區 多線程

    • YGC回收以後,大多數的對象會被回收,活着的進入s0
    • 再次YGC,活着的對象eden + s0 -> s1
    • 再次YGC,eden + s1 -> s0
    • 年齡足夠 -> 老年代 (15 CMS 6)
    • s區裝不下 -> 老年代
  • 老年代
    • 頑固分子
    • 老年代滿了FGC Full GC
  • GC Tuning (Generation)
    • 儘可能減小FGC
    • MinorGC = YGC
    • MajorGC = FGC

常見的垃圾回收器

  • Serial 年輕代 串行回收
    單CPU效率最高,虛擬機是Client模式的默認垃圾回收器。Serial回收器使用單線程進行垃圾回收,使用複製算法。在 HotSpot 虛擬機中,使用-XX:+UseSerialGC 參數能夠指定使用Serial(新生代串行收集器)+ Serial Old(老年代串行收集器)。
  • PS 年輕代 並行回收
    新生代並行回收收集器也是使用複製算法的收集器。從表面上看,它和並行收集器同樣都是多線程、獨佔式的收集器。可是,並行回收收集器有一個重要的特色:它很是關注系統的吞吐量。
    在啓動參數中指定-XX:+UseParallelGC,會使用Parallel Scavenge(新生代並行回收收集器) + SerialOld的回收器組合
    若是使用-XX:+UseParallelOldGC,表示Parallel Scavenge(新生代並行回收收集器)+ Parallel Old(並行回收收集器)併發

  • ParNew 年輕代 配合CMS的並行回收

Serial回收器的多線程版本,只能用於新生代。使用複製算法,多線程並行工做。在多CPU主機上的性能高於Serial,單CPU主機上的性能低於Serial。
若是使用-XX:+UseParNewGC,表示ParNew(並行收集器)+ Serial Old(串行收集器)ide

  • SerialOld老年代 串行回收

Serial收集器的老年版本,獨佔式,單線程,使用的是標記--整理算法,這個收集器的目的也是用於Client模式下的虛擬機使用。性能

  • ParallelOld老年代 並行回收

是Parallel Scavenge收集器的老年版本,使用多線程和標記整理算法,注重吞吐量優先,在注重吞吐量和CPU資源銘感的場合,均可以考慮Parallel Scavenge加Parallel Old收集器。spa

  • ConcurrentMarkSweep 老年代 併發的, 垃圾回收和應用程序同時運行,下降STW的時間(200ms)

算法:三色標記 + Incremental Update
1.初始標記:Stop the world,只標記GC Roots能直接關聯到的對象。
2.併發標記:GC Roots Tracing
3.從新標記:Stop the world,修正併發標記期間,因用戶程序繼續運行致使標記產生變更的那一部分對象的標記記錄。
4.併發清除:併發清除能夠和用戶線程一塊兒運行,因此整體上停頓的時間很是短。
可是CMS收集器有三個顯著缺點:
1.對CPU資源敏感。
2.沒法處理浮動垃圾。
3.收集結束後會產生大量碎片。線程

  • G1 (10ms) 算法:三色標記 + SATB

1.G1的設計原則是"首先收集儘量多的垃圾(Garbage First)"。所以,G1並不會等內存耗盡(串行、並行)或者快耗盡(CMS)的時候開始垃圾收集,而是在內部採用了啓發式算法,在老年代找出具備高收集收益的分區進行收集。同時G1能夠根據用戶設置的暫停時間目標  自動調全年輕代和總堆大小,暫停目標越短年輕代空間越小、總空間就越大;
  2.G1採用內存分區(Region)的思路,將內存劃分爲一個個相等大小的內存分區,回收時則以分區爲單位進行回收,存活的對象複製到另外一個空閒分區中。因爲都是以相等大小的分區爲單位進行操做,所以G1自然就是一種壓縮方案(局部壓縮);
  3.G1雖然也是分代收集器,但整個內存分區不存在物理上的年輕代與老年代的區別,也不須要徹底獨立的survivor(to space)堆作複製準備。G1只有邏輯上的分代概念,或者說每一個分區均可能隨G1的運行在不一樣代之間先後切換;
  4.G1的收集都是STW的,但年輕代和老年代的收集界限比較模糊,採用了混合(mixed)收集的方式。即每次收集既可能只收集年輕代分區(年輕代收集),也可能在收集年輕代的同時,包含部分老年代分區(混合收集),這樣即便堆內存很大時,也能夠限制收集範圍,從而 下降停頓。設計

  • ZGC (1ms) PK C++ 算法:ColoredPointers + LoadBarrier
相關文章
相關標籤/搜索