Когда именно JVM выдает ошибку OutOfMemoryError

Мы запускаем приложение Java, которое иногда «зависает», потому что какой-то поток использует почти всю кучу. Несмотря на то, что JVM выполняет полную сборку мусора, длящуюся более 60 секунд, приложение никогда не умирает с OutOfMemoryError.

Я прочитал из документации Java, что:

Сборщик пропускной способности выдаст исключение нехватки памяти, если слишком много времени тратится на сборку мусора. Например, если JVM тратит более 98% общего времени на сборку мусора и восстанавливает менее 2% кучи, это вызовет нехватку памяти.

Я хотел бы получить дополнительную информацию о том, что означает эти 98% времени (каковы временные рамки?), И можно ли уменьшить это значение, то есть выдать OOME, если приложение тратит 90% времени на сборку мусора. и не может освободить более 10% кучи.

Цель состоит в том, чтобы обеспечить завершение работы приложения (вместо того, чтобы выполнять только сборку мусора) с OOME, чтобы мы могли сгенерировать дамп в OOME.

Вот используемые нами настройки памяти и GC (ОС Solaris):

-Xms2048m -Xmx2048m \
-Xmn512m \
-XX:PermSize=256m 
-XX:MaxPermSize=256m \
-XX:+UseParNewGC 
-XX:ParallelGCThreads=16 \
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled \
-XX:+DisableExplicitGC \
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
-Xloggc:/gcmonitor.log \
-XX:+HandlePromotionFailure \
-XX:SurvivorRatio=4 
-XX:TargetSurvivorRatio=90 
-XX:MaxTenuringThreshold=10 \
-XX:+UseTLAB 
-XX:TLABSize=32k 
-XX:+ResizeTLAB \
-XX:+UseMPSS \
16
задан neirda 18 January 2012 в 16:43
поделиться