【发布时间】:2011-11-03 01:55:48
【问题描述】:
我有一个关于 java GC 的问题。我知道年轻代有次要收集,老生代有主要收集,通常 YG 的大小小于终身代的大小。因此,次要收集比主要收集更频繁地发生。
我的问题是,当次要收集和主要收集开始时,它们如何不同地影响应用程序线程?
如果次要收集发生得更频繁,是否会使应用程序线程更频繁地暂停,即使它快速收集垃圾对象?
谢谢。
【问题讨论】:
我有一个关于 java GC 的问题。我知道年轻代有次要收集,老生代有主要收集,通常 YG 的大小小于终身代的大小。因此,次要收集比主要收集更频繁地发生。
我的问题是,当次要收集和主要收集开始时,它们如何不同地影响应用程序线程?
如果次要收集发生得更频繁,是否会使应用程序线程更频繁地暂停,即使它快速收集垃圾对象?
谢谢。
【问题讨论】:
我的问题是,当次要收集和主要收集开始时,它们如何不同地影响应用程序线程?如果次要收集发生得更频繁,是否会使应用程序线程更频繁地暂停,即使它快速收集垃圾对象?
简单的答案是您的问题(几乎)是同义反复。如果次要收集更频繁地发生,并且次要收集导致应用程序暂停,那么当然这会使应用程序暂停更频繁。
真正的答案是,行为取决于各个空间的大小(例如 YG 与 YG + TG)以及......更重要的是......取决于您配置 JVM 使用的 GC。例如,如果您使用的是低暂停收集器,那么暂停应该不会很明显......除非您将限制推得太远。
请注意,重要的是停顿的长度,而不是停顿的频率。太短而无法注意到的停顿不会伤害任何人。
【讨论】: