什么是G1垃圾回收算法
轉(zhuǎn)載自?什么是G1垃圾回收算法
為解決CMS算法產(chǎn)生空間碎片和其它一系列的問題缺陷,HotSpot提供了另外一種垃圾回收策略,G1(Garbage First)算法,通過參數(shù) -XX:+UseG1GC來啟用,該算法在JDK 7u4版本被正式推出,官網(wǎng)對此描述如下:
The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories. It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:
Can operate concurrently with applications threads like the CMS collector.
Compact free space without lengthy GC induced pause times.
Need more predictable GC pause durations.
Do not want to sacrifice a lot of throughput performance.
Do not require a much larger Java heap.
G1垃圾收集算法主要應用在多CPU大內(nèi)存的服務中,在滿足高吞吐量的同時,竟可能的滿足垃圾回收時的暫停時間,該設計主要針對如下應用場景:
垃圾收集線程和應用線程并發(fā)執(zhí)行,和CMS一樣
空閑內(nèi)存壓縮時避免冗長的暫停時間
應用需要更多可預測的GC暫停時間
不希望犧牲太多的吞吐性能
不需要很大的Java堆 (翻譯的有點虛,多大才算大?)
堆內(nèi)存結(jié)構
1、以往的垃圾回收算法,如CMS,使用的堆內(nèi)存結(jié)構如下:
新生代:eden space + 2個survivor
老年代:old space
持久代:1.8之前的perm space
元空間:1.8之后的metaspace
這些space必須是地址連續(xù)的空間。
2、在G1算法中,采用了另外一種完全不同的方式組織堆內(nèi)存,堆內(nèi)存被劃分為多個大小相等的內(nèi)存塊(Region),每個Region是邏輯連續(xù)的一段內(nèi)存,結(jié)構如下:
每個Region被標記了E、S、O和H,說明每個Region在運行時都充當了一種角色,其中H是以往算法中沒有的,它代表Humongous,這表示這些Region存儲的是巨型對象(humongous object,H-obj),當新建對象大小超過Region大小一半時,直接在新的一個或多個連續(xù)Region中分配,并標記為H。
Region
堆內(nèi)存中一個Region的大小可以通過 -XX:G1HeapRegionSize參數(shù)指定,大小區(qū)間只能是1M、2M、4M、8M、16M和32M,總之是2的冪次方,如果G1HeapRegionSize為默認值,則在堆初始化時計算Region的實踐大小,具體實現(xiàn)如下:
默認把堆內(nèi)存按照2048份均分,最后得到一個合理的大小。
GC模式
G1中提供了三種模式垃圾回收模式,young gc、mixed gc 和 full gc,在不同的條件下被觸發(fā)。
young gc
發(fā)生在年輕代的GC算法,一般對象(除了巨型對象)都是在eden region中分配內(nèi)存,當所有eden region被耗盡無法申請內(nèi)存時,就會觸發(fā)一次young gc,這種觸發(fā)機制和之前的young gc差不多,執(zhí)行完一次young gc,活躍對象會被拷貝到survivor region或者晉升到old region中,空閑的region會被放入空閑列表中,等待下次被使用。
| 參數(shù) | 含義 | | :-: | --- | | -XX:MaxGCPauseMillis | 設置G1收集過程目標時間,默認值200ms | | -XX:G1NewSizePercent | 新生代最小值,默認值5% | | -XX:G1MaxNewSizePercent | 新生代最大值,默認值60% |
mixed gc
當越來越多的對象晉升到老年代old region時,為了避免堆內(nèi)存被耗盡,虛擬機會觸發(fā)一個混合的垃圾收集器,即mixed gc,該算法并不是一個old gc,除了回收整個young region,還會回收一部分的old region,這里需要注意:是一部分老年代,而不是全部老年代,可以選擇哪些old region進行收集,從而可以對垃圾回收的耗時時間進行控制。
那么mixed gc什么時候被觸發(fā)?
先回顧一下cms的觸發(fā)機制,如果添加了以下參數(shù):
-XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly當老年代的使用率達到80%時,就會觸發(fā)一次cms gc。
相對的,mixed gc中也有一個閾值參數(shù) -XX:InitiatingHeapOccupancyPercent,當老年代大小占整個堆大小百分比達到該閾值時,會觸發(fā)一次mixed gc.
mixed gc的執(zhí)行過程有點類似cms,主要分為以下幾個步驟:
initial mark: 初始標記過程,整個過程STW,標記了從GC Root可達的對象
concurrent marking: 并發(fā)標記過程,整個過程gc collector線程與應用線程可以并行執(zhí)行,標記出GC Root可達對象衍生出去的存活對象,并收集各個Region的存活對象信息
remark: 最終標記過程,整個過程STW,標記出那些在并發(fā)標記過程中遺漏的,或者內(nèi)部引用發(fā)生變化的對象
clean up: 垃圾清除過程,如果發(fā)現(xiàn)一個Region中沒有存活對象,則把該Region加入到空閑列表中
full gc
如果對象內(nèi)存分配速度過快,mixed gc來不及回收,導致老年代被填滿,就會觸發(fā)一次full gc,G1的full gc算法就是單線程執(zhí)行的serial old gc,會導致異常長時間的暫停時間,需要進行不斷的調(diào)優(yōu),盡可能的避免full gc.
總結(jié)
以上是生活随笔為你收集整理的什么是G1垃圾回收算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直频采样、超外差和数字下变频架构组合|W
- 下一篇: 国货崛起!驰为Freebook二合一平板