首页 > 编程知识 正文

jdk1.8默认的垃圾收集器,g1垃圾收集器过程

时间:2023-05-05 23:51:00 阅读:189666 作者:561

G1垃圾收集器(jdk9将G1更改为缺省垃圾收集器,总体上采用标记整理算法。 在局部,它是一个新的垃圾收集器,在jdk1.7中正式用于代替CMS。

G1的设计原则是简化JVM的性能调整,开发人员只需三个简单的步骤就可以完成调整。

步骤1,选中G1垃圾收集器的步骤2,设置堆最大内存的步骤3,并设置最大停止时间

G1提供了三种模式的垃圾回收: Young GC、Mixed GC和Full GC,它们在各种条件下触发。原理:

G1垃圾收集器与其他收集器相比,最大的区别在于废除年轻一代、老一代的物理划分,取而代之的是堆栈

分为几个区域(Region ),这些区域包含逻辑上的年轻一代、旧时代的区域。

这样做的好处就是,我们再也不用单独的空间对每个代进行设置了,不用担心每个代内存是否足够。

在由G1分隔的区域中,年轻一代的垃圾回收仍然通过暂停所有应用程序线程,将生存对象复制到旧的年代或Survivor

空格,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。

这意味着在正常处理过程中,G1将完成堆压缩(至少部分堆压缩),并且不再出现cms内存碎片问题。

在G1中,有一种特殊的区域,叫Humongous区域。

如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象

默认情况下,这些大型对象直接分配给旧年代,但如果它们是短期存在的大型对象,则会在垃圾收集器中创建它们

造成负面影响。

为了解决这个问题,G1被划分为用于存储巨大对象的Humongous区域。如果一个H区装不下一个巨型

对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC

G1的Young GC工作原理

Young GC主要对Eden区进行GC,在Eden空间消失时触发。

Eden空间的数据移动到Survivor空间,如果Survivor空间不够,Eden空间的一部分数据就那样升级到老一代

空间。 Survivor区的数据移动到了新的Survivor区,部分数据晋升到了老年代的空间。

最终Eden空间的数据为空,GC停止动作,应用线程继续执行。

Remembered Set

在对付GC年轻一代的时候,我们如何找到年轻一代中对手的根对象?

根的对象可能在年轻的一代中,也可能在旧的年代中,旧的年代中的所有对象都是根吗?

如果对旧年进行全量扫描,这样扫描会花很多时间。

因此,G1引入了RSet的概念。 它的全名是Remembered Set,用于跟踪对堆中的对象引用。 每次Region初始化后,RSet都会初始化。 此RSet用于记录和跟踪其他Region对该Region中对象的引用

默认情况下,Region以512Kb拆分为多个卡,因此RSet必须记录的是xx Region的xx Card。

Mixed GC

随着越来越多的对象升级到旧版本的old region,虚拟机将具有混合的垃圾收集器,以避免耗尽堆内存

混合GC,该算法不仅回收整个Young Region,而且回收部分Old Region,而不是Old GC。 这里需要注意

含义:不是所有的老年代,而是一些老年代,可以选择哪个old region收集,垃圾回收需要时间

低控制。 请注意,混合GC不是完全GC。

混合GC什么时候触发? 由参数xx : initiatingheapoccupancypercent=决定。 默认值: 45%,此参数的含义如下:

当上一代大小占堆大小总数的百分比达到此阈值时触发。

那个GC步骤被分为步骤。

全局标记(global concurrent自豪的网络ing )生存对象(evacuation )全局并发标记

执行过程分为以下五个步骤。

首字母缩写(initial tondered net,STW ) ) )。

标记可直接从根节点访问的对象,在此阶段将执行年轻一代的GC一次,并出现全局姿势。

根区域扫描(root region scan ) )。

G1 GC在初始标签的生存区中扫描对旧年代的参照,对被参照的对象进行标签化。

此阶段与非STW应用程序同时运行,只有在此阶段完成后,才能开始下一个STW年轻一代的垃圾回收

我收下。

同时标记(Co

ncurrent Marking)
G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃
圾回收中断。
重新标记(Re傲娇的网络,STW)
该阶段是 STW 回收,因为程序在运行,针对上一次的标记进行修正。
清除垃圾(Cleanup,STW)
清点和重置标记状态,该阶段会STW,这个阶段并不会实际上去做垃圾的收集,等待evacuation阶段来
回收。

拷贝存活对象
Evacuation阶段是全暂停的。该阶段把一部分Region里的活对象拷贝到另一部分Region中,从而实现垃圾的回收
清理。

G1收集器相关参数

-XX:+UseG1GC使用 G1 垃圾收集器-XX:MaxGCPauseMillis设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到),默认值是 200 毫秒。-XX:G1HeapRegionSize=n设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。默认是堆内存的1/2000。-XX:ParallelGCThreads=n设置 STW 工作线程数的值。将 n 的值设置为逻辑处理器的数量。n 的值与逻辑处理器的数量相同,最多为 8。-XX:ConcGCThreads=n设置并行标记的线程数。将 n 设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右。-XX:InitiatingHeapOccupancyPercent=n设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。 -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -Xmx256m#日志[GC pause (G1 Evacuation Pause) (young), 0.0044882 secs] [Parallel Time: 3.7 ms, GC Workers: 3] [GC Worker Start (ms): Min: 14763.7, Avg: 14763.8, Max: 14763.8, Diff: 0.1] #扫描根节点 [Ext Root Scanning (ms): Min: 0.2, Avg: 0.3, Max: 0.3, Diff: 0.1, Sum: 0.8] #更新RS区域所消耗的时间 [Update RS (ms): Min: 1.8, Avg: 1.9, Max: 1.9, Diff: 0.2, Sum: 5.6] [Processed Buffers: Min: 1, Avg: 1.7, Max: 3, Diff: 2, Sum: 5] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] #对象拷贝 [Object Copy (ms): Min: 1.1, Avg: 1.2, Max: 1.3, Diff: 0.2, Sum: 3.6] [Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.2] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 3] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [GC Worker Total (ms): Min: 3.4, Avg: 3.4, Max: 3.5, Diff: 0.1, Sum: 10.3] [GC Worker End (ms): Min: 14767.2, Avg: 14767.2, Max: 14767.3, Diff: 0.1] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.0 ms] #清空CardTable [Other: 0.7 ms] [Choose CSet: 0.0 ms] #选取CSet [Ref Proc: 0.5 ms] #弱引用、软引用的处理耗时 [Ref Enq: 0.0 ms] #弱引用、软引用的入队耗时 [Redirty Cards: 0.0 ms] [Humongous Register: 0.0 ms] #大对象区域注册耗时 [Humongous Reclaim: 0.0 ms] #大对象区域回收耗时 [Free CSet: 0.0 ms] [Eden: 7168.0K(7168.0K)->0.0B(13.0M) Survivors: 2048.0K->2048.0K Heap:55.5M(192.0M)->48.5M(192.0M)] #年轻代的大小统计[Times: user=0.00 sys=0.00, real=0.00 secs]

对于G1垃圾收集器优化建议
年轻代大小
避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。
固定年轻代的大小会覆盖暂停时间目标。
暂停时间目标不要太过严苛
G1 GC 的吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间。
评估 G1 GC 的吞吐量时,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开
o 等其他相关选项显式设置年轻代大小。
固定年轻代的大小会覆盖暂停时间目标。
暂停时间目标不要太过严苛
G1 GC 的吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间。
评估 G1 GC 的吞吐量时,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开
销,而这会直接影响到吞吐量。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。