Арендная коллекция начинается без видимой причины

У меня есть приложение Java, которое обычно имеет очень здоровую статистику сбора мусора. Арендованный сбор обычно происходит каждый час или около того, а порции STW занимают всего доли секунды. Но странно, что коллекция всегда происходит в течение первых пяти минут после запуска приложения. Это реальная проблема, потому что в это время загрузка ЦП уже намного выше обычной (из-за увеличения числа сетевых вызовов, которые в конечном итоге кэшируются), поэтому эти паузы всегда длиннее обычного и даже запускаются после 8 секунд, если я делаю перезапустить при очень большой нагрузке.

Вот аргументы JVM:

-Xms4096m 
-Xmx4096m 
-XX:PermSize=768m 
-XX:MaxPermSize=768m 
-XX:SurvivorRatio=6 
-XX:NewSize=1024m 
-verbose:gc 
-XX:-DisableExplicitGC 
-XX:+PrintGCDetails 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCTimeStamps 
-XX:+PrintHeapAtGC 
-XX:+PrintTenuringDistribution 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:MaxDirectMemorySize=2048m 
-XX:+UseConcMarkSweepGC 
-XX:+CMSClassUnloadingEnabled 
-XX:+PrintConcurrentLocks 
-XX:+ExplicitGCInvokesConcurrent 

Вопрос здесь в том, что запускает эту постоянную коллекцию, так как в старом поколении почти 2 ГБ свободно, когда это происходит. Вот использование при нормальных обстоятельствах прямо перед арендованной коллекцией:

concurrent mark-sweep generation total 3145728K, used 2897098K 

А вот использование непосредственно перед тем, как постоянная коллекция запускается в течение первых нескольких минут после запуска:

concurrent mark-sweep generation total 3145728K, used 1573655K 

Насколько я понимаю, постоянная коллекция должна появляться только тогда, когда старый ген почти заполнен; что могло вызвать это иначе?

1 ответ

Решение

Ключевой концепцией CMS является то, что она должна начать собираться до того, как у вас закончится свободное пространство, что позволит ей работать одновременно. Если он подождет, пока вы не закончите, он вызовет последовательную остановку сбора мира.

По этой причине есть два порога, чтобы определить, когда запускать коллекцию преждевременно.

-XX:CMSInitiatingOccupancyFraction=90 (by default)
-XX+UseCMSInitiatingOccupancyOnly

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

Насколько я понимаю, постоянная коллекция должна появляться только тогда, когда старый ген почти заполнен;

Это то, что делает параллельный коллектор.

Другие вопросы по тегам