日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM之G1垃圾收集器

發布時間:2023/12/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM之G1垃圾收集器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述:

?

G1(Grabage-First)是一款面向服務端應用的垃圾收集器,主要針對配備多核cpu及大容量內存的機器,以及高概率滿足GC停頓時間的同時,還兼顧高吞吐量的的性能特征

在JDK1.7版本正式啟用,移除了Experimental的標識,是JDK 9以后的默認垃圾回收器,取代了CMS 回收器以及Parallel + Parallel Ol的組合。被Oracle官方稱為“全功能垃圾收集器”

與此同時,CMS已經在JDK9中被標記為廢棄(deprecated)。在jdk8中還不是默認垃圾收集器,需要使用-XX:+UserG1GC來啟用。

二、為什么叫G1

a、因為G1是一個并行回收器,它把堆內存分割為很多不相關的區域(Region)物理上是不連續的,使用不同的Region來表示Eden、幸存者0區、幸存者1區,老年代等。

三、G1回收器的特點:

a、并行與并發:

并行性:G1在回收期間,可以有多個GC線程同時工作,有效利用多核計算能力,此時用戶線程STW

并發性:G1擁有與應用程序交替執行的能力,部分工作可以和應用程序同時執行,因此,一般來說,不會在整個回收階段發生完全阻塞應用程序的情況。

b、分代收集:

(1)從分代上看,G1依然屬于分代型垃圾收集器,它不區分年輕代和老年代,年輕代依然有Eden區和Survivor區。但從堆的結構上看,它不要求整個Eden區、年輕代或者老年代都是連續的,也不再堅持固定大小和固定數量。

如下圖:

?

?(2)將堆空間氛圍若干個區域(Region),這些區域中包含了邏輯上的年輕代和老年代。

(3)和之前的各類回收器不同,它同時兼顧年輕代和老年代,對比其他回收器,或者工作在年輕代或者工作在老年代。

C、空間整合

(1)CMS:“標記-清除”算法、內存碎片,若干次GC后進行一次碎片整理

(2)G1將內存劃分為一個個的region。內存的回收是以region作為基本單位的

Region之間是復制算法,但整體上實際可看作是標記-壓縮(Mark-Compact)算法,兩種算法都可以避免內存碎片,這種特性有利于程序長時間運行,分配大對象不會因為無法找到連續內存空間而提前觸發下一次GC。尤其是當Java堆非常大的時候,G1的優勢更加明顯。

d、可預測的停頓時間模型(即:軟實時soft real-time)

這是G1相對于CMS的另一大優勢,G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用明確指定在一個長度為M毫秒的時間片段內,消耗垃圾收集的時間不得超過N毫秒。

(1)由于分區的原因,G1可以之選取部分區域進行內存回收,這樣縮小了回收范圍,因此對于全局停頓情況的發生也能得到較好的控制

(2)G1跟蹤各個Region里面的垃圾堆積的價值大小(回收所活得的空間大小以及回收所需要時間的經驗值),在后臺維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的region,保證了G1收集器在有限的時間內可以獲得進可能高的收集效率

(3)相比與CMS GC,G1未必能做到CMS在最好情況下的延時停頓、但最差情況要好很多。

四、缺點:

相較于CMS,G1還不具備全方位,壓倒性優勢。比如在用戶程序運行過程中,G1無論是為了垃圾收集產生的內存占用(Footprint)還是程序運行時的額外執行負載(Overload)都要比CMS要高

從經驗上來說,在小內存應用上CMS的表現大概率會優于G1,而G1在大內存應用上則發揮其優勢。平衡點在6-8GB之間

五、參數設置:

-XX:+UserG1GC 手動指定使用G1收集器執行內存回收任務。

-XX:? +G1HeapRegionSize 設置每個Region的大小,值是2的冪,范圍是1MB到32MB,默認是堆內存的1/2000,目標是根據最小的Java堆大小劃分出約2048個區域。

-XX:MaxGCPauseMillis 設置期望達到的最大GC停頓時間指標(JVM會盡力實現,但不保證達到)。默認值是200ms

-XX:ParallelGCThread 設置STW時GC線程數的值,最多設置為8

-XX:ConcGCThread 設置并發標記的線程數,將n設置為并行垃圾回收線程數(ParallerlGCThreads)的1/4左右

-XX:InitiatingHeapOccupancyPercent 設置出發并發GC周期Java堆占用率的閾值。超過此值,就出發GC,默認值是45.

六、G1的使用

G1的設計原則就是簡化JVM性能調優,開發人員只需要簡單的三步即可完成調優:

第一步:開啟G1垃圾收集器

第二步:設置堆的最大內存

第三步:設置最大的停頓時間

G1中提供了三種垃圾回收模式:YoungGC、Mixed GC 和Full GC,在不同的條件下被觸發。

七、G1 使用的場景:

?八、region的使用:

a、概述:使用G1收集器時,它將整個Java堆劃分成2048個大小相同的獨立Region塊,每個Region塊大小根據堆空間的實際大小而定,整個被控制在1MB到32MB之間,且為2的N次冪,即1MB、2MB、4MB、8MB、16MB、32MB、可以通過-XX:G1HeapRegionSize設定。所有的Region大小相同,且在JVM生命周期內不會被改變。

雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,他們都是一部分Region(不需要連續)的集合。通過Region的動態分配方式實現邏輯上的連續。

b、圖解:

?一個Region有可能屬于Eden,Survivor 或者 Old/Tenured 內存區域,但是一個region只可能屬于一個角色。圖中E 表示該region 屬于Eden內存區域,s表示屬于Survivor 內存區域,o 表示屬于Old內存區域。途中空白的表示未使用的內存空間。

G1 垃圾收集器還增加了一個新的內存區域,叫做Humongous 內存區域,如圖中的H塊。主要用于存儲大對象,如果超過1.5個region ,就放到H

c、設置H的原因:

對于堆中的大對象,默認直接分配到老年代,但是如果它是一個短期存在的大對象,就會對垃圾收集器造成負面影響,為了解決這個問題,G1劃分了一個Humongous區,它用來專門存放大對象,如果一個H區域裝不下一個大對象,那么G1會尋找連續的H區來存儲,為了能找到連續的H區,有時候不得不啟動Full GC。G1的大多數行為都把H區域作為老年代的一部分來看待。

d、region 分配方式:

?九、G1垃圾回收器的主要環節:

?圖解:

?應用程序分配內存,當年輕代的Eden區用盡時開始年輕代回收過程;G1的年輕代收集階段是一個并行的獨占式收集器。在年輕代回收期,G1 GC暫停所有應用程序線程,啟動多線程執行年輕代回收。然后從年輕代區間移動存活對象到Survivor 區間或者老年代區間,也有可能是兩個區間都會涉及。

當堆內存使用達到一定值(默認45%)時,開始老年代并發標記過程

標記完成馬上開始混合回收過程,對于一個混合回收期,G1 GC 從老年代區間移動存活對象到空閑區間,這些空閑區間也就成了老年代的一部分,和年輕代不同,老年代的G1 回收器和 其他GC 不同,G1的老年代回收器不需要整個老年代被回收,一次只需要掃描/回收一小部分老年代的Region就可以了,同時,這個老年代Region是和年輕代一起被回收的。

十、記憶集和寫屏障

前提:

一個對象被不同區域引用的問題。

一個Region不可能是孤立的,一個Region中的對象可能被其他任意Region中對象引用,判斷對象存活時,是否需要掃描整個Java堆才能保證準確?

在其他的分代收集器,也存在這樣的問題(而G1更突出)

回收新生代也不得不同時掃描老年代?

這樣的話會降低Minor GC 的效率。

解決如上問題:
無論G1還是其他分代收集器,JVM都是使用Remembered Set(記憶集)來避免全局掃描,

每個Region 都有一個對應的Remembered Set;

如圖:

?每次Reference類型數據寫操作時,都會產生一個Write Barrier(寫屏障)暫時中斷操作,

然后檢查將要寫入引用指向的對象是否和該Reference類型數據在不同的Region(其他收集器:檢查老年代對象是否引用新生代對象);

如果不同,通過CardTable 把相關引用信息記錄到引用引用對象的所在的Region對應的Remembered Set 中。

當進行垃圾收集時,在GC根節點的枚舉范圍加入Remembered Set中,就可以保證不進行全局掃描,也不會有遺漏。

十一、G1 具體收集過程:

?年輕代GC:

?

?備注:

?

?并發標記過程:

?混合回收:

?

?Full GC:

?十二、例子:

G1 正常的例子:

?

總結

以上是生活随笔為你收集整理的JVM之G1垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。