5.G1垃圾回收器的工作原理(上)

时间:2019-09-05 来源:www.ouchun.net

1. ParNew和CMS组合的问题

ParNew和CMS的最大问题在于它将是Stop The World,我们没有时间控制它。

2. G1的优点和设计理念

您可以控制GC的预期暂停时间。例如,G1垃圾收集可以设置为在1小时内停止200ms。最大限度地减少GC停顿对系统的影响。尽可能多地回收并选择具有较少暂停时间的内存。

3. G1简介

G1可以回收新一代和老一辈,并且负有全部责任。它的内部存储器分为很多Rigion,每个Rigion都会有相应的恢复值,比如这些10Region对应20M内存,其恢复时间为100ms,G1会记录这些信息。回收时可以选择性回收。可能如下图所示:

Image.png

4.如何分配Gig的Rigion?

地区可能属于新一代,也可能属于老年。它可以由G1动态改变和控制。因此,G1没有空间为年轻一代分配空间,以及在老年时分配了多少空间。那么Gig的Rigion会有多少,每个地区有多大?它由(堆内存/2048)=单个Region内存大小组成,因为JVM最多可以放置2048.Rigion的内存大小应该是2的倍数。例如,如果我们将4G分配给堆内存,那么每个区域的大小是2M。如下图所示:

Image.png

5.新一代,老年,大型物品的区域分布

新一代内存分配

当G1初始化时,新一代占据区域的5%,大约100个Rigen,新生成比率可以通过-XX: G1NewSizePercent参数设置初始化。随着程序的运行,新一代将拥有越来越多的Rigion。新一代可占总数的60%,约为1200个地区。它可以由-XX: G1MaxNewSizePercent指定。 G1将根据操作动态增加Region。

老年记忆分配

新一代占最大的60%,其余40%是老年人的最大比例,约800个地区,而Rigion的分布是动态的。

大对象内存分配

如何在G1中定义大对象?对象大小大于区域内存的50%称为大对象,大对象可以跨多个区域。由于Region的分配是动态的,因此G1有一个特殊的Region来存储大型对象。三者的内存分配如下:

Image.png

参数说明

-XX: + UseG1GC使用G1垃圾收集器

-XX: G1HeapRigionSize指定每个Rigion大小

-XX: G1NewSizePercent指定G1的大小以初始化新一代,默认为5%

-XX: G1MaxNewSizePercent指定G1新一代的最大比例

-XX: MaxGCPauseMills执行GC时的最大暂停时间,默认为200ms

7.是否有年轻一代,伊甸园,幸存者?

G1还保留了新一代的Eden和Survivor区域,并将Eden与Survivor的比率设置为-XX: SurvivorRatio=8。在上面的设置中,新一代占1200个区域,然后根据8: 1: 1,伊甸园区域约占1000,而幸存者两个区域各占约100个。如下图所示:

Image.png

8.G1年轻一代垃圾收集

年轻一代垃圾收集机制实际上和以前一样。系统运行时,对象将分发给年轻一代。当年轻代内存达到最大值的60%时,将触发年轻代垃圾收集。此时,Stop The World将启动。使用复制算法将幸存对象保存到S区域。请注意,年轻一代的回收并不一定意味着必须达到最大比例。例如,我们将恢复暂停时间设置为100毫秒。然后大约有200个区域,占据500M内存。恢复时间为100毫秒,然后G1将返回。回收。因此,内部过程由G1控制。没有办法确切说明触发器是什么。需要通过工具来观察。

Image.png

9.物体何时进入老年?

G1进入老年的时间与以前相同:

1.年龄达到-XX:由MaxTenuringThreshold设置的值,下次再循环时,它将是旧的。

2.动态年龄判断,在年轻一代GC中,一批物体的记忆大小大于某一区域记忆的50%,那么大于该年龄的所有物体都进入老年。例如,年龄1 +年龄2+年龄3 +年龄4大于S面积记忆的50%,然后年龄>=4年龄对象进入老年。

在年轻一代GC之后,S区将无法进入老年。

Wenthkim

2019.08.18 09: 35

字数1190

1. ParNew和CMS组合的问题

ParNew和CMS的最大问题在于它将是Stop The World,我们没有时间控制它。

2. G1的优点和设计理念

您可以控制GC的预期暂停时间。例如,G1垃圾收集可以设置为在1小时内停止200ms。最大限度地减少GC停顿对系统的影响。尽可能多地回收并选择具有较少暂停时间的内存。

3. G1简介

G1可以回收新一代和老一辈,并且负有全部责任。它的内部存储器分为很多Rigion,每个Rigion都会有相应的恢复值,比如这些10Region对应20M内存,其恢复时间为100ms,G1会记录这些信息。回收时可以选择性回收。可能如下图所示:

Image.png

4.如何分配Gig的Rigion?

地区可能属于新一代,也可能属于老年。它可以由G1动态改变和控制。因此,G1没有空间为年轻一代分配空间,以及在老年时分配了多少空间。那么Gig的Rigion会有多少,每个地区有多大?它由(堆内存/2048)=单个Region内存大小组成,因为JVM最多可以放置2048.Rigion的内存大小应该是2的倍数。例如,如果我们将4G分配给堆内存,那么每个区域的大小是2M。如下图所示:

Image.png

5.新一代,老年,大型物品的区域分布

新一代内存分配

当G1初始化时,新一代占据区域的5%,大约100个Rigen,新生成比率可以通过-XX: G1NewSizePercent参数设置初始化。随着程序的运行,新一代将拥有越来越多的Rigion。新一代可占总数的60%,约为1200个地区。它可以由-XX: G1MaxNewSizePercent指定。 G1将根据操作动态增加Region。

老年记忆分配

新一代占最大的60%,其余40%是老年人的最大比例,约800个地区,而Rigion的分布是动态的。

大对象内存分配

如何在G1中定义大对象?对象大小大于区域内存的50%称为大对象,大对象可以跨多个区域。由于Region的分配是动态的,因此G1有一个特殊的Region来存储大型对象。三者的内存分配如下:

Image.png

参数说明

-XX: + UseG1GC使用G1垃圾收集器

-XX: G1HeapRigionSize指定每个Rigion大小

-XX: G1NewSizePercent指定G1的大小以初始化新一代,默认为5%

-XX: G1MaxNewSizePercent指定G1新一代的最大比例

-XX: MaxGCPauseMills执行GC时的最大暂停时间,默认为200ms

7.是否有年轻一代,伊甸园,幸存者?

G1还保留了新一代的Eden和Survivor区域,并将Eden与Survivor的比率设置为-XX: SurvivorRatio=8。在上面的设置中,新一代占1200个区域,然后根据8: 1: 1,伊甸园区域约占1000,而幸存者两个区域各占约100个。如下图所示:

Image.png

8.G1年轻一代垃圾收集

年轻一代垃圾收集机制实际上和以前一样。系统运行时,对象将分发给年轻一代。当年轻代内存达到最大值的60%时,将触发年轻代垃圾收集。此时,Stop The World将启动。使用复制算法将幸存对象保存到S区域。请注意,年轻一代的回收并不一定意味着必须达到最大比例。例如,我们将恢复暂停时间设置为100毫秒。然后大约有200个区域,占据500M内存。恢复时间为100毫秒,然后G1将返回。回收。因此,内部过程由G1控制。没有办法确切说明触发器是什么。需要通过工具来观察。

Image.png

9.物体何时进入老年?

G1进入老年的时间与以前相同:

1.年龄达到-XX:由MaxTenuringThreshold设置的值,下次再循环时,它将是旧的。

2.动态年龄判断,在年轻一代GC中,一批物体的记忆大小大于某一区域记忆的50%,那么大于该年龄的所有物体都进入老年。例如,年龄1 +年龄2+年龄3 +年龄4大于S面积记忆的50%,然后年龄>=4年龄对象进入老年。

在年轻一代GC之后,S区将无法进入老年。

1. ParNew和CMS组合的问题

ParNew和CMS的最大问题在于它将是Stop The World,我们没有时间控制它。

2. G1的优点和设计理念

您可以控制GC的预期暂停时间。例如,可以将g1垃圾收集设置为在1小时内停止200毫秒。最小化GC暂停对系统的影响。尽可能多地回收并选择暂停时间较短的内存。

三。G1简介

G1可以循环利用新一代和老年人,并负全责。它的内存分为很多个rigion,每个rigion都会有一个对应的恢复值,比如这10个区域对应20M内存,其恢复时间为100ms,g1会记录这个信息。回收时可选择性回收。可能如下所示:

0×251C

图片.png

4。如何分配gig的权限?

地区可能属于新一代,也可能属于老年。它可以被g1动态地改变和控制。因此,G1没有为年轻一代分配空间,也没有为老年人分配多少空间。那么,全球信息栅格将有多少套,每个区域有多大?它由(堆内存/2048)=单个区域内存大小组成,因为JVM最多可容纳2048个。Rigion的内存大小应该是2的倍数。例如,如果我们将4G分配给堆内存,那么每个区域的大小是2米。

0×251d

图片.png

5.新一代、老年、大对象的地域分布

新一代内存分配

当G1初始化时,新一代占据区域的5%,大约100个Rigen,新生成比率可以通过-XX: G1NewSizePercent参数设置初始化。随着程序的运行,新一代将拥有越来越多的Rigion。新一代可占总数的60%,约为1200个地区。它可以由-XX: G1MaxNewSizePercent指定。 G1将根据操作动态增加Region。

老年记忆分配

新一代占最大的60%,其余40%是老年人的最大比例,约800个地区,而Rigion的分布是动态的。

大对象内存分配

如何在G1中定义大对象?对象大小大于区域内存的50%称为大对象,大对象可以跨多个区域。由于Region的分配是动态的,因此G1有一个特殊的Region来存储大型对象。三者的内存分配如下:

Image.png

参数说明

-XX: + UseG1GC使用G1垃圾收集器

-XX: G1HeapRigionSize指定每个Rigion大小

-XX: G1NewSizePercent指定G1的大小以初始化新一代,默认为5%

-XX: G1MaxNewSizePercent指定G1新一代的最大比例

-XX: MaxGCPauseMills执行GC时的最大暂停时间,默认为200ms

7.是否有年轻一代,伊甸园,幸存者?

G1还保留了新一代的Eden和Survivor区域,并将Eden与Survivor的比率设置为-XX: SurvivorRatio=8。在上面的设置中,新一代占1200个区域,然后根据8: 1: 1,伊甸园区域约占1000,而幸存者两个区域各占约100个。如下图所示:

Image.png

8.G1年轻一代垃圾收集

年轻一代垃圾收集机制实际上和以前一样。系统运行时,对象将分发给年轻一代。当年轻代内存达到最大值的60%时,将触发年轻代垃圾收集。此时,Stop The World将启动。使用复制算法将幸存对象保存到S区域。请注意,年轻一代的回收并不一定意味着必须达到最大比例。例如,我们将恢复暂停时间设置为100毫秒。然后大约有200个区域,占据500M内存。恢复时间为100毫秒,然后G1将返回。回收。因此,内部过程由G1控制。没有办法确切说明触发器是什么。需要通过工具来观察。

Image.png

9.物体何时进入老年?

G1进入老年的时间与以前相同:

1.年龄达到-XX: MaxTenuringThreshold设置的值,下次再循环时,它将是旧的。

2.动态年龄判断,在年轻一代GC中,一批物体的记忆大小大于某一区域记忆的50%,那么大于该年龄的所有物体都进入老年。例如,年龄1 +年龄2+年龄3 +年龄4大于S面积记忆的50%,则年龄≥4的对象进入老年。

在年轻一代GC之后,S区将无法进入老年。

http://www.whgcjx.com/bds4sP/hi8.html