JVM學習——G1垃圾回收器(學習過程)


JVM學習——G1垃圾回收器

把這個跨時代的垃圾回收器的筆記獨立出來。

新生代:適用復制算法

老年代:適用標記清除、標記整理算法

二娃本來看G1的時候覺得比較枯燥,但是后來總結完之后告訴我說,一定要慢慢的學,不要跳過東西。之前不懂的在后面總結的時候就豁然開朗了。

G1從JDK9開始,已經成為默認垃圾收集器。

G1:Garbage First Collector

垃圾優先的收集器和其他收集器最明顯的不通:

物理結構和形態和之前極為不同。比如對於堆的使用空間的划分。哪里用於老年代,哪里用於新生代等等。

垃圾收集器的存在的兩個指標

魚和熊掌可兼得

吞吐量

吞吐量關注的是在一個指定的時間內,最大化一個應用的工作量

TPS:在同一個小時內同一個事物(或者任務,請求)完成的次數

數據庫一小時可以完成多少次查詢。

對於關注吞吐量的系統來說,卡頓(STW)是可以接受的。

image-20200221044656071

相應能力

指一個程序或者系統對請求能夠及時相應。如

  1. 一個桌面UI

對於這類對相應能力敏感的場景,長時間的停頓是無法接受的。

image-20200221045033423

G1的設計目標

G1就是為了解決這兩種問題而存在的垃圾回收器。(設計目標)

滿足短時間GC停頓的同時達到一個較高的吞吐量

image-20200221045242126

使用JVM參數就可以啟用G1垃圾回收器。

image-20200221045406981

幾乎不需要STW,但是還有的。 一般很多人喜歡拿G1和CMS比較。

GC停頓更加可控(和新的物理結構設計有很大的關系,堆的內存的划分方式和CMS不一樣。不是按照新生代和老年代來划分堆內存的。)

浮動垃圾:在清除的過程中,還會有產生的垃圾。這些垃圾稱為浮動垃圾。

G1的設計規划:是要替換掉CMS。

image-20200221050124805

但是實際上,並不是為了替換而替換的。因為不同的業務系統對於不同的需求不一樣。必須對響應能力要求比較高的情況下,有時候是不需要考慮吞吐量的,所以在選用的時候還是需要酌情考慮。

HotSpot虛擬機的主要構成

image-20200221050649489

方法區:存儲的類的元數據,全局性的信息等等

Heap:堆,存放對象

Java線程:

程序計數器:用來表示程序指令所持有的信息

Naive:本地內部線程

再往下:執行引擎:JIT Compiler 及時編譯器,垃圾收集器

垃圾收集器堆內存划分和角色分派

傳統的垃圾收集器堆結構(非G1的垃圾收集器)

image-20200221051025193

年輕代:Eden,S0,S1。 復制算法。

Old Generation:老年代。

永久代:已經棄用。1.8 包括1.8 以后就沒有了。 老年代是不會晉升永久代的。永久代存的是常量之類的東西。 (10年以上工作經驗的 好多都會說錯,說老年代晉升永久代)

G1收集器堆結構

image-20200221051437081

描述:交織在一起,沒有規律可言。

顯然:命名策略沒有發生變化,還是用的Eden、Survivor、Old Generation、作用還是原來的作用。

但是:物理內存的方式,發生了翻天覆地的變化,和傳統的堆內存划分沒什么關系。

G1:堆內存,就是一個區域,就是一個Heap。regions

image-20200221051833760

對每個角色的數量並沒有強制的限定,對每種內存的大小,可以動態變化。

G1最大的特點就是高效的執行回收,優先去執行那些大量對象可回收的區域(region)。

image-20200221052314784

G1采用復制算法

image-20200221052700332

G1只是特定的整理幾個Region。並不是整理所有的Region。所以GC停頓時間會明顯變少。

image-20200221052741560

關於G1的一些重要概念

image-20200221052818542

分區:G1是依附的重要概念。每一個區域的大小是一樣的。但是角色會動態發生變化。但是在同一時刻,某一個分區只是屬於單一的某一個代。

image-20200221052919755

年輕代,幸存區,老年代這些概念還在,但是成為了邏輯上的概念。

G1名字由來:垃圾優先。 G1會優先回收垃圾對象特別多的分區。

image-20200221053101981

G1:在新生代滿的時候,對新生代進行回收。和傳統的一致。

image-20200221053137783

復制算法的優點

image-20200221053210753

CSet:就是要被收集的區域的集合。統稱為收集集合。

image-20200221053247448

RSet:記錄其他Region中對象的引用本Region中對象的關系。

價值在於:不需要掃描整個堆去找誰引用了當前分區中的對象。只需要掃描Rset即可。

image-20200221053401961

image-20200221053510116

上述內容摘自:知乎 R大, RednaxelaFX.

image-20200221054008838

4個重要概念:

SATB

Region

CSet

RSet

官網解讀

https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

image-20200221054316776

![image-20200221055615144](/Users/shangyifeng/Library/Application Support/typora-user-images/image-20200221055615144.png)

三個跟性能有關的JVM組件。高亮了。調優的時候主要針對這三部分。

兩種調優:1. 調整堆的大小 2. 選擇合適的垃圾回收器。 3. 在新版本的JDK中,我們幾乎不用動JIT。

image-20200221055743087

關於:關注點響應能力和吞吐量 的解釋原文。

image-20200221060032502

關於G1存在的目的:是為了替換CMS。和G1的詳細介紹。

我去,這些東西不是都在官網嗎?

image-20200221060952495

When performing garbage collections, G1 operates in a manner similar to the CMS collector. G1 performs a concurrent global marking phase to determine the liveness of objects throughout the heap. After the mark phase completes, G1 knows which regions are mostly empty. It collects in these regions first, which usually yields a large amount of free space. This is why this method of garbage collection is called Garbage-First. As the name suggests, G1 concentrates its collection and compaction activity on the areas of the heap that are likely to be full of reclaimable objects, that is, garbage. G1 uses a pause prediction model to meet a user-defined pause time target and selects the number of regions to collect based on the specified pause time target.

The regions identified by G1 as ripe for reclamation are garbage collected using evacuation. G1 copies objects from one or more regions of the heap to a single region on the heap, and in the process both compacts and frees up memory. This evacuation is performed in parallel on multi-processors, to decrease pause times and increase throughput. Thus, with each garbage collection, G1 continuously works to reduce fragmentation, working within the user defined pause times. This is beyond the capability of both the previous methods. CMS (Concurrent Mark Sweep ) garbage collector does not do compaction. ParallelOld garbage collection performs only whole-heap compaction, which results in considerable pause times.

It is important to note that G1 is not a real-time collector. It meets the set pause time target with high probability but not absolute certainty. Based on data from previous collections, G1 does an estimate of how many regions can be collected within the user specified target time. Thus, the collector has a reasonably accurate model of the cost of collecting the regions, and it uses this model to determine which and how many regions to collect while staying within the pause time target.

Note: G1 has both concurrent (runs along with application threads, e.g., refinement, marking, cleanup) and parallel (multi-threaded, e.g., stop the world) phases. Full garbage collections are still single threaded, but if tuned properly your applications should avoid full GCs.

image-20200221061649786

RSet和CSet的概念

G1收集器的階段:

image-20200221063350225

image-20200221063726523

和CMS階段執行內容不同的階段。

G1總結:

image-20200221063827891

有問題,就查詢官網。

G1 深度理論講解

Young GC和 Mix GC

Eden空間滿的時候,收集新生代。使用G1收集器。

image-20200221064718071

CSet

RSet涉及兩個概念:points-into 和 points-out

SATB三色算法:增量式的標記算法。:沿着某一個起點,逐步的深入追蹤。這就叫增量式。

我們不能將本來不是垃圾的對象當成垃圾來回收的,這種情況百分百是不能出現的。

把本來是垃圾的對象,認為不是垃圾。這種情況是允許的。稱為浮動垃圾。

G1相對於CMS的優勢

image-20200221065138262

  1. 壓縮空間的優勢: CMS-標記清除算法,內存碎片多。 G1用的是拷貝算法,直接清除原空間
  2. Region分區,避免內存碎片問題
  3. Eden,Survivor,Old區不固定。是因為,G1沒有顯示固定設置每個代的空間大小。只是要求每個分區的大小是一樣的就行。哪個區域不夠開辟哪個空間
  4. G1可以通過設置預測模型,設置運行時間:指定的預判收集時間,顯示的控制用戶指定的收集時間
  5. G1采用的是內存拷貝的方法,直接清空釋放空間。
  6. G1能夠在年輕代使用。CMS只使用與老年代。

G1的使用場景

image-20200221065537337

image-20200221065914243

對於G1的收集,兩種模式:對於年輕代的收集成為Young GC。 Mixed GC對於老年代和年輕代,都能夠回收。

image-20200221072148804

全局並發標記:

image-20200221072537627

image-20200221072609190

image-20200221072817090

image-20200221072840781

  1. young GC
  2. 並發階段
  3. 混合模式
  4. Full GC

Young GC觸發時間:

image-20200221072916156

那么 什么時候觸發Mixed GC?

image-20200221072956232

image-20200221073036233

G1HeapWasterPercent:參數

image-20200221073046644

G1MixedGCLiveThresholdPercent:參數

image-20200221073247215

G1MixedGCCOuntTarget:參數

image-20200221073350236

G1OldSetRegionThresholdPercent:參數

image-20200221073401953

G1 GC其他參數
image-20200221073456120
其中:humongous為超大空間

image-20200221074230354

無論是新生代還是老年代,都是復制算法。

image-20200221074323963

巨大對象:存放在humongous區域。如果一個H區域放不下,會尋找連續的H分區來存儲。

image-20200221074426931

image-20200221074715271

image-20200221075051780

image-20200221075116034

image-20200221075249932

image-20200221075319845

image-20200221075341171

image-20200221075406178

image-20200221075424345

image-20200221075452036

image-20200221075531528

三色標記算法:黑白灰

三色標記算法為了解決並行標記出問題的情況。(漏標-本來不是垃圾的對象沒有標記)(誤標-本來是垃圾的沒有標記)

image-20200221075558885

並發標記采用的算法:三色標記算法。描述:追蹤式(從根部追蹤)。

image-20200221075630006

但凡被標記對象,都不是垃圾,都不應該沒回收掉

黑色:根對象,GCRoot,起源/ 該對象或者子對象都被掃描過了,也是黑色。

灰色:還沒標記完,掃描當中

白色:還未被標記。掃描完成之后,白色對象就是不可達的對象,即垃圾對象。

image-20200223065312300

image-20200223065440517

image-20200223065542978

變黑:是因為 不再引用其他的任何對象了,自身也掃描完了。

image-20200223070023551

垃圾回收的漏標問題是如何產生的呢?如下狀態

image-20200223070058521

如果A.c = C。 B.c = null. 變成了這個樣子。

image-20200223070318303

這時候的問題就是:C對象已經被漏掉了。要被回收掉了。顯然這是不合理的。這就是漏標現象。

SATB來合理的解決漏標的問題

image-20200223070605135

image-20200223070628987

變成非白色的:變成非白色之后就不會被垃圾回收掉了。就算真的沒用了,也沒事。但是就是不能被誤刪除。

image-20200223071837215

image-20200223072116822

新生代用分區,並不是為了提升效率。只是為了適合能夠控制大小

SATB詳解

image-20200223072621424

image-20200223072705450

隱式標記:默認灰色。找到新分配的對象

image-20200223072900936

完整標記的流程

image-20200223072952762

image-20200223073208470

image-20200223074037456

手動通過用戶設置為null的,標記灰色

image-20200223074235924

image-20200223074321449

image-20200223074718900

這里的停頓時間,並不是越短越好。因為:時間短,收集的垃圾就少。

image-20200223074859845

image-20200223075842185

image-20200223075907807

image-20200223080027741

G1的最佳實戰

  1. 不斷調優暫停時間指標:-XX:MaxGCPauseMillis=x

    image-20200223080249323

    暫停時間不能太短:如果太短就會導致出現G1跟不上垃圾產生的速度。最終退化成FUll GC。

  2. 不要設置新生代和老年代的大小

    image-20200223080454407

    G1有自動調大小的功能

  3. 關注Evacuation Failure

    image-20200223080634317

G1 系統性回顧

通過上面的初次學習,應該對G1有了很好的認識。

  • 吞吐量-響應能力兼顧
  • G1收集器的設計目標和設計規划
  • HotSpot虛擬機的主要構成
  • 傳統垃圾收集器堆結構
  • G1收集器堆結構
  • G1和CMS的對比、優勢
  • G1的重要概念:Region分區-CSet已收集集合-RSet已記憶集合-SATB增量式標記算法
  • G1 GC模式:Young GC - Mixed GC、兩種都是STW
  • 全局並發標記:Global Concurrent Marking。主要是為Mixed GC提供標記服務
  • G1在運行過程中的主要模式。YGC、並發階段、混合模式、Full GC
    • YGC:對所有的新生代都進行GC
    • 並發階段:全局並發標記階段。
    • 混合模式:MIXedGC,先執行YGC,對回收性價比比較高的進行回收
    • Full GC,並不屬於G1,在極端情況下,Mixed跟不上速度,只能被迫調用FullGC
  • Humongous區域
  • card table結構。(RSet)(Point-in Point-out 指向引用和被引用對象)
  • Young GC
  • Mixed GC
  • 三色標記算法(追蹤式跟蹤使用的算法)
  • G1分代算法
  • SATB(SnapShot at the beginning)
  • Evacuation Failure

以上都是概念性的描述。

通過實例查看G1日志

image-20200223094350584

image-20200223094951987

image-20200223095442797

方向性的建議

  1. 概念肯定是要知道的。然后再實踐。針對底層原理要精讀,慢啃。

  2. 對於JVM的學習,不要東一棒槌,西一榔頭的。全面的涉及。

  3. 記錄記錄記錄,學習的時候記住了,之后肯定會忘記

  4. 學習沒有任何捷徑。研讀源碼。網上的文章一般都是到底層的時候,就結束了。

  5. openjdk.java.net

  6. 看別人,是偷懶的表現,能夠讓自己不用經過大腦思考,不經過自己的努力就能夠獲取到,而往往也不珍惜。

2020年02月23日11:16:24

關於JVM的學習暫時先到這里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM