您好,我正在生产中使用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 markingconcurrent 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 regionG1HeapWastePercent
Mixed GC。reclaimable_percent
garbage object size / total space sizecollection 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 / 100GC Pause Time,所以最终的old_region_length受gc暂停时间的限制。但是混合GC会将collecion set中尽可能多的区域放入old_region_length,直到回收这些区域所需的总时间接近估计的GC Pause Time为止。https://stackoverflow.com/questions/70443249
复制相似问题