Как уменьшить время обработки слабых ссылок во время сборки мусора?

В настоящее время я столкнулся с проблемой, что мое приложение время от времени показывает долгое время сборки мусора, но все это вызвано только слабой обработкой ссылок. Таким образом, время остановки потока всегда близко к времени обработки слабой ссылки. Все остальные циклы 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, я получаю длинные нормальные циклы сборки мусора. Машина имеет 8 ядер и потребляет не так много процессора для приложения. Пытался запустить сборщик мусора старого поколения раньше и одновременно.

И да, я не могу избавиться от использования слабых ссылок, потому что это часть сторонней библиотеки.

10
задан ReneS 4 November 2010 в 21:23
поделиться