您好,我正在生产中使用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设置为零会有什么好处吗?
发布于 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 marking
、Only Young GC
和Mixed GC
。一般程序如下:
Only Young GC
结束时,将判断是否有必要启动concurrent marking
concurrent marking
后,将计算每个区域(旧代)中的活动对象和垃圾对象占用的空间。collection set
(待回收的旧区域集合),只有存活对象的大小超过G1MixedGCLiveThresholdPercent的老代区域才能进入collection set
。collection set
进行排序,_gc_efficiency
排名第一。reclaimable_percent
of collection set
超过G1HeapWastePercent
%,则稍后将触发Mixed GC
。Mixed GC
将选择所有年轻区域,并回收旧地区的old_region_length
。reclaimable_percent
仍然超过G1HeapWastePercent
%,那么Mixed GC
将在以后再次执行。让我解释以下几个参数和概念:
G1MixedGCLiveThresholdPercent
collection set
。_gc_efficiency
the size of garbage objects in a single region
/ the time it takes to transfer this region
G1HeapWastePercent
Mixed GC
。reclaimable_percent
garbage object size
/ total space size
collection set
中垃圾对象的总大小。G1MixedGCCountTarget
G1OldCSetRegionThresholdPercent
the number of allocated regions in heap
* 10 / 100old_region_length
Mixed GC
选择collecion set
中的旧区域的old_region_length
进行回收min_old_cset_length
,上限为max_old_cset_length
。min_old_cset_length
= the size of collection set / G1MixedGCCountTarget
。max_old_cset_length
= the number of allocated regions in heap * G1OldCSetRegionThresholdPercent / 100
GC Pause Time
,所以最终的old_region_length受gc暂停时间的限制。但是混合GC会将collecion set
中尽可能多的区域放入old_region_length
,直到回收这些区域所需的总时间接近估计的GC Pause Time
为止。https://stackoverflow.com/questions/70443249
复制相似问题