(四)G1 garbage collector

g1专为大内存,多内核机型设计。可以兼顾高吞吐量和低暂停时间。

 

g1将堆分为多个相同大小内存块,并发的标记线程,使得g1掌握了各个内存块的活对象数量,

内存回收阶段,g1根据用户指定的暂停时间,选择部分内存块进行回收。选择死对象占比高的

内存块可以使得暂停时间最短。

 

g1采用标记复制算法,在内存回收时解决了不连续的问题。这是cms不具备的

 

g1可以保证应用在使用内存较大的堆时,有较短的延迟。6G堆可以低于0.5s gc延迟。

 

g1在逻辑上也分为新生代和老年代。同时为大对象分配了专门区域。

 

g1在标记复制过程中,如果发现无内存可用,会引发分配失败,从而出发 full gc(stop the world)

 

g1在复制对象时也会有暂停,young gc和mixed gc都会有

 

-XX:InitiatingHeapOccupancyPercent=<NN> 指定了开始标记周期的条件,当堆的占用比例达到NN时,开始标记周期,为mixed gc做准备。

 

-XX:GCPauseIntervalMillis=<NN> 可以指定最短多长可以进行一次gc

 

g1内存模型中的内存块的大小根据堆大小的不同而不同,内存块总的数量不会超过2048个

 

young gc时,g1调整新生代的大小从而达到暂停时间的目标

 

mixed gc时,为了达成目标,g1调整每次回收老年代的内存块数量,每个区域中活对象的占比和堆内存的浪费比例。

 

g1使用多个独立的记忆表来存储,各个区域的对象对应的引用。多个独立的记忆表使得各个回收线程独立工作在不同区域。

 

新生代的垃圾回收:

将存活对象在eden,一个sur复制到另一个sur中。存活了指定代的对象,转移到老年代。

—XX:MaxTenuringThreshold=指定存活多少代然后转移。

 

g1在标记循环完成前进行young gc ,完成后进行mixed gc。

 

标记周期的各个阶段:

初始化标记:标记root,这个阶段在young gc(stop the world)中完成

根区域扫描:

并发标记:

重新标记:

清理:

 

g1是自适应的垃圾回收器,可以在默认情况下自我调整,从而高效工作。

 

默认参数:

-XX:G1HeapRegionSize=n:目标是region总数量不超过2048

 

-XX:MaxGCPauseMillis=200

 

-XX:G1NewSizePercent=5:新生代占堆的最小比例

-XX:G1MaxNewSizePercent=60:新生代占堆的最大比例

 

-XX:ParallelGCThreads=n

 

-XX:ConcGCThreads=n

 

-XX:InitiatingHeapOccupancyPercent=45:标记周期开始的条件:堆内对象占堆的百分比,达到之后开始标记周期,为mixed gc做准备

 

-XX:G1MixedGCLiveThresholdPercent=85,内存占用达到85的old region,被列入mixed gc的对象。

 

-XX:G1HeapWastePercent=5:可回收的内存超过这个比例时,g1才开始mixed gc的周期

 

-XX:G1MixedGCCountTarget=8:多少个回收

 

-XX:G1OldCSetRegionThresholdPercent=10,每个回收多少个old region 

-XX:G1ReservePercent=10:预留内存

 

 

使用g1的建议:

1.不要设置新生代的大小,因为这样会覆盖掉暂停时间目标的设定,也就是说,只要设置暂停时间目标就好。

2.g1:应用时间:gc时间=90:10,对于parallel,应用时间:gc时间=99:1,追求短的暂停时间,必然会造成吞吐量的下降。

3.对以下参数进行试验,调整。

  • -XX:InitiatingHeapOccupancyPercent: Use to change the marking threshold.

  • -XX:G1MixedGCLiveThresholdPercent and -XX:G1HeapWastePercent: Use to change the mixed garbage collection decisions.

  • -XX:G1MixedGCCountTarget and -XX:G1OldCSetRegionThresholdPercent: Use to adjust the CSet for old regions.

 

g1基于标记复制算法,to space不足会报错:

解决办法:

-XX:G1ReservePercent 增加to space大小

-XX:InitiatingHeapOccupancyPercent 减小开始标记的阈值

-XX:ConcGCThreads  增加回收线程

 

大于g1 region一半的对象会被分配到大对象区域,每个大对象分配在一个region中,大量略微大于region一半的对象,会造成内存不连续,浪费了内存。

此时应该提高region大小,—XX:G1HeapRegionSize这些对象就不会被分配到大对象区域了。

 

转载于:https://www.cnblogs.com/swaggyC/p/6189223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值