目前我遇到的问题是,我的应用程序偶尔会显示长时间的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。
同时,是的,我无法摆脱弱引用的使用,因为这是第三方库的一部分。