如何在垃圾回收期间降低弱引用处理时间?

10

目前我遇到的问题是,我的应用程序偶尔会显示长时间的GC时间,但所有这些都仅由弱引用处理引起。因此,线程停止时间总是接近于弱引用处理时间。所有其他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。

同时,是的,我无法摆脱弱引用的使用,因为这是第三方库的一部分。

1个回答

7

我在“hotspot-gc-use”邮件列表中找到了这个消息

简而言之,请尝试使用-XX:+ParallelRefProcEnabled开关。


更新

我在Jon Masamitsu的博客中找到了更好的解释:

6)低暂停收集器中的并行引用处理。

对于大量使用Reference对象的应用程序,处理引用对象的GC工作可能是显著的。在低暂停收集器中,它不一定比其他收集器更差,但会更加影响效果(因为我们试图让暂停时间更短)。低暂停收集器支持并行引用处理,但默认情况下未开启。除非有大量参考对象,否则串行执行引用处理通常更快。如果广泛使用Reference对象(大多数应用程序不使用),请使用标志-XX:+ParallelRefProcEnabled来开启它。


好的。我明天早上会尝试一下。 - ReneS
帮帮忙!现在的时间大约在0.2到0.5之间,看起来是可预测的。太棒了! - ReneS
抱歉...我只是从电子邮件中复制粘贴的。 - Stephen C
不是批评,只是其他人知道而已。再次感谢! - ReneS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接