目前我遇到的问题是我的应用程序偶尔会显示很长的GC时间,但所有这些只是由弱参考处理引起的。所以线程停止时间总是接近弱ref处理时间。所有其他GC循环均为0.0001秒至0.200秒。
来自gc.log(重新格式化):
10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) ,
0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs]
[1 CMS-remark: 2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs]
[Times: user=2.51 sys=0.00, real=2.18 secs]
Total time for which application threads were stopped: 2.1906890 seconds
目前我已经准备好了这些设置。尝试更简单的设置,但没有变化。
-Xms4g
-Xmx4g
-XX:NewSize=128m
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:MaxGCPauseMillis=50
-XX:CMSInitiatingOccupancyFraction=50
-XX:ParallelGCThreads=16
-XX:+DisableExplicitGC
如果我打开NewSize,我最终会得到很长的正常GC循环。该机器有8个内核,并没有为应用程序烧掉那么多的CPU。试图尽早和同时运行旧的GC。
是的,我无法摆脱弱参考使用,因为这是第三方库的一部分。
答案 0 :(得分:7)
我在“hotspot-gc-use”邮件列表中找到了this message。
简而言之,请尝试-XX:+ParallelRefProcEnabled
切换。
<强>更新强>
我在Jon Masamitsu的Weblog中找到了更好的解释:
6)低暂停收集器中的并行参考处理。
对于广泛使用
Reference
个对象的应用程序,GC处理Reference对象的工作非常明显。在低暂停收集器中它不一定比在其他收集器中更糟糕,但是它会伤害更多(因为我们试图保持较低的暂停)。并行参考处理可用于低暂停收集器,但默认情况下不启用。除非有大量的参考对象,否则连续进行参考处理通常会更快。如果您大量使用-XX:+ParallelRefProcEnabled
对象(大多数应用程序没有),请使用标记Reference
将其打开。