У меня есть приложение 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
Я понимаю, что сбор данных должен происходить только тогда, когда старый ген почти заполнен; что может вызвать это иначе?
Спасибо за ваш ответ. Вы говорите, что JVM не знает, сколько времени займет накопительная коллекция, поэтому она запускается без необходимости в первый раз? Я понимаю, что не дождался, пока он на самом деле полон, но в моем случае он почти наполовину заполнен. И если это так, установит эти два флага, чтобы JVM подождал, пока старый ген будет на 90% заполнен, прежде чем делать первую коллекцию? – Cameron
@Cameron Это то, что он должен делать, да. Я стараюсь сделать размер eden очень большим, например. 24 ГБ, а затем пространство для хранения прост в настройке;) –
вы установили свой eden на 24gb ... так что вы никогда не попадаете в полный GC, потому что все остается в молодом поколении? – Cameron