2014-09-29 3 views
0

У меня есть приложение 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 

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

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 

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

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

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

+1

Спасибо за ваш ответ. Вы говорите, что JVM не знает, сколько времени займет накопительная коллекция, поэтому она запускается без необходимости в первый раз? Я понимаю, что не дождался, пока он на самом деле полон, но в моем случае он почти наполовину заполнен. И если это так, установит эти два флага, чтобы JVM подождал, пока старый ген будет на 90% заполнен, прежде чем делать первую коллекцию? – Cameron

+0

@Cameron Это то, что он должен делать, да. Я стараюсь сделать размер eden очень большим, например. 24 ГБ, а затем пространство для хранения прост в настройке;) –

+0

вы установили свой eden на 24gb ... так что вы никогда не попадаете в полный GC, потому что все остается в молодом поколении? – Cameron

Смежные вопросы