我认为,“年轻一代”中的对象在升级为“老一代”或“终身老一代”之前,必须在15个次要GC中生存(最大15个)。
新阈值是什么意思,它如何影响JVM年轻一代GC或次要GC?
这是否意味着Young Generation的大小不足以使JVM对对象执行15个GC?
在下面的示例中,新阈值是10。这是否意味着我必须增加堆大小,或者特别是对于年轻一代?
Desired survivor size 121634816 bytes, new threshold 10 (max 15)
PSAdaptiveSizePolicy::compute_eden_space_size: costs minor_time: 0.004921 major_cost: 0.047628 mutator_cost: 0.947450 throughput_goal: 0.990000 live_space: 330899520 free_space: 1115684864 old_eden_size: 419430400 desired_eden_size: 436207616
AdaptiveSizePolicy::survivor space sizes: collection: 28 (125829120, 113246208) -> (125829120, 121634816)
AdaptiveSizeStop: collection: 28
[PSYoungGen: 421856K->10080K(532480K)] 785165K->373389K(1269760K), 0.0312765 secs] [Times: user=0.25 sys=0.00, real=0.03 secs]
2018-07-04T02:09:01.886+0800: 359.263: [GC (Allocation Failure) AdaptiveSizePolicy::update_averages: survived: 4587536 promoted: 0 overflow: false
AdaptiveSizeStart: 359.286 collection: 29
avg_survived_padded_avg: 111951304.000000 avg_promoted_padded_avg: 43516000.000000 avg_pretenured_padded_avg: 41.070663 tenuring_thresh: 11 target_size: 113246208
答案 0 :(得分:1)
年轻一代分为三个区域:一个伊甸园空间和两个幸存者空间。大多数对象(非常大的对象除外)都使用简单(快速)的指针碰撞方法在Eden空间中分配。当指针到达Eden空间的末尾时,需要发生次要GC。与其将所有对象直接推广到旧一代中,不如让它们在幸存者空间中呆一段时间,让它们更长的时间变成垃圾,并减轻旧一代集合的负担。
有两个幸存者空间;一个是“从”空间(当前包含对象),一个是“到”空间(有效为空)。来自伊甸园的实时数据以及所有仍处于活动状态且尚未达到“起始”空间中新阈值的对象均复制到“至”空间。然后将两个幸存空间的角色颠倒(“至”变成“从”,“从”变成“到”)为下一个次要GC准备。
幸存者空间中已达到新(通常称为保有权)阈值的对象被提升为老一代。
很显然,如果您的应用程序以比幸存者空间可以处理的速度更快的速度分配对象,则GC将更快地提升对象。影响此参数的参数是MaxTenuringThreshold,它是最大值,而不是确定的值。
您可以使用各种参数来调整区域的大小。请阅读以获取更多详细信息:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html