Мы запускаем приложение Java, которое иногда «зависает», потому что какой-то поток использует почти всю кучу.
Несмотря на то, что JVM выполняет Full GC, который длится более 60 секунд, приложение никогда не умирает с OutOfMemoryError.
Я прочитал из документации Java, что:
Сборщик пропускной способности выдает исключение нехватки памяти, если слишком много времени тратится на сборку мусора.
Например, если JVM тратит более 98% общего времени на сборку мусора и восстанавливает менее 2% кучи, это приведет к нехватке памяти.
Я хотел бы получить дополнительную информацию о том, что означают эти 98% времени (каковы временные рамки?) И возможно ли снизить это значение, т. Е. Выдать OOME, если приложение проводит 90% времени в GC и не может освободить более 10% кучи.
Цель - убедиться, что приложение умрет (вместо выполнения только GC) с 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 \