首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在G1HeapWastePercent中将G1设置为零的后果

在G1HeapWastePercent中将G1设置为零的后果
EN

Stack Overflow用户
提问于 2021-12-22 01:15:39
回答 1查看 581关注 0票数 0

您好,我正在生产中使用G1 (Hotspot JDK 11),并试图了解它是如何工作的。据我所知,G1中的旧GC只清理那些满是垃圾的区域,否则就会将区域放入某个队列中。

稍后,混合GC被触发,它将用amount of Old generations/G1MixedGCCountTarget老区域来清理年轻区域。要扫描的旧区域由G1MixedGCLiveThresholdPercent确定,默认为65%,即如果65 %的区域是垃圾,那么它将被清理。

然而,我不确定我是否理解G1HeapWastePercent的含义。从正式文件

设置您愿意浪费的堆的百分比。当>可回收百分比小于堆浪费百分比时,Java >HotSpot VM不会启动混合垃圾收集周期。缺省值是10 %。此设置在Java 23的HotSpot VM中不可用。

比方说,区域里有65%的垃圾。G1开始将生命对象从年轻区域移动到填充垃圾的单一旧区域,一旦该区域仅包含10 %的垃圾,G1就切换到另一个旧区域。如果我的假设是正确的,那么将G1HeapWastePercent设置为0将完全填充这个区域的生命对象。是对的吗?如果时间延迟不是我的应用程序的优先级,那么将G1HeapWastePercent设置为零会有什么好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-23 05:11:40

首先,我认为您可能误解了G1MixedGCLiveThresholdPercent的效果( Jdk7中的默认值为65%,Jdk 11中的85%为65%)。G1MixedGCLiveThresholdPercent不是垃圾对象的空间比率,而是活动对象的空间比率。如果一个区域中的活动对象的空间超过85% (在jdk11中),则该区域将不会被选择到collection set (要回收的区域集合)中。

其次,G1HeapWastePercent( Jdk7中默认值为10%,Jdk11中为5% )是触发混合GC和退出混合GC的一个条件。当collection set中的垃圾对象占堆分配空间总数的5%以上时,将触发混合GC,而退出混合GC的充分条件之一,即collection set中的垃圾对象率低于5%。

因此,如果G1HeapWastePercent设置为0%,只要收集集中存在垃圾对象,混合GC就会被触发。然后,退出混合GC的充分条件是collection set为空,因为每个混合GC将从collection set中删除回收区域。

最后,我想向您解释G1 GC的执行过程,以便您能够更好地理解整个过程。

G1包含三个阶段,concurrent markingOnly Young GCMixed GC。一般程序如下:

  1. Only Young GC结束时,将判断是否有必要启动concurrent marking
  2. 完成concurrent marking后,将计算每个区域(旧代)中的活动对象和垃圾对象占用的空间。
    1. 然后生成collection set (待回收的旧区域集合),只有存活对象的大小超过G1MixedGCLiveThresholdPercent的老代区域才能进入collection set
    2. 在此之后,对collection set进行排序,_gc_efficiency排名第一。

  3. 如果reclaimable_percent of collection set超过G1HeapWastePercent %,则稍后将触发Mixed GC
  4. Mixed GC将选择所有年轻区域,并回收旧地区的old_region_length
    1. 在混合GC执行结束时,如果reclaimable_percent仍然超过G1HeapWastePercent%,那么Mixed GC将在以后再次执行。

让我解释以下几个参数和概念:

G1MixedGCLiveThresholdPercent

  1. openjdk11中的默认值为85,G1MixedGCLiveThresholdPercent
  2. 相关的使用位置是字节数,它用于计算单个区域内物体存活率的阈值。超过此阈值的区域将不会进入collection set

_gc_efficiency

  1. 单个区域的回收价值
  2. _gc_efficiency = the size of garbage objects in a single region / the time it takes to transfer this region
  3. 如果该区域中有更多的垃圾对象,并且传输所需的时间越短,_gc_efficiency就会越高。

G1HeapWastePercent

  1. openjdk11中的默认值是5,G1HeapWastePercent
  2. 相关代码混合用于确定下一个GC是否为Mixed GC

reclaimable_percent

  1. reclaimable_percent = garbage object size / total space size
  2. 这里的垃圾对象是指collection set中垃圾对象的总大小。

G1MixedGCCountTarget

  1. openjdk11中的默认值是8,G1MixedGCCountTarget
  2. 指示一旦触发混合GC,期望执行8混合GC。

G1OldCSetRegionThresholdPercent

  1. openjdk11中的默认值是10,G1OldCSetRegionThresholdPercent
  2. 每次混合GC时,所选的old_region_length都有一个最大值。
  3. 最大值= the number of allocated regions in heap * 10 / 100

old_region_length

  1. 此值意味着此Mixed GC选择collecion set中的旧区域的old_region_length进行回收
  2. 此值的下限为min_old_cset_length,上限为max_old_cset_length
  3. min_old_cset_length = the size of collection set / G1MixedGCCountTarget
  4. max_old_cset_length = the number of allocated regions in heap * G1OldCSetRegionThresholdPercent / 100
  5. 因为G1将严格控制每个GC Pause Time,所以最终的old_region_length受gc暂停时间的限制。但是混合GC会将collecion set中尽可能多的区域放入old_region_length,直到回收这些区域所需的总时间接近估计的GC Pause Time为止。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70443249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档