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

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

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

Ответ 1

Я нашел это сообщение в списке рассылки "hotspot-gc-use".

Короче говоря, попробуйте переключатель -XX:+ParallelRefProcEnabled.


UPDATE

Я нашел лучшее объяснение в Jon Masamitsu Weblog:

6) Параллельная обработка ссылок в коллекторе с низкой паузой.

Для приложения, которое широко использует объекты Reference, работа GC по обработке объектов Reference может быть заметной. Это не обязательно хуже в коллекторе с низкой паузой, чем в другом, но это больно больше (потому что мы стараемся, чтобы паузы были низкими). Параллельная обработка ссылок доступна для коллектора с низкой паузой, но по умолчанию не включена. Если не существует тонны ссылочных объектов, серийная обработка ссылок обычно выполняется быстрее. Включите его с флагом -XX:+ParallelRefProcEnabled, если вы широко используете объекты Reference (большинство приложений нет).