После переключения нашего java-приложения (службы, запущенного на Tomcat) JRE с Java 7 на Java 8, мы начали видеть java.lang.OutOfMemoryError: Metaspace
после нескольких дней с большим объемом трафика.
Использование кучи в порядке. Metaspace перескакивает после того, как когда-то исполнялся тот же поток кода во время тестирования производительности.
Что может быть причиной возникновения проблемы с памятью в метаспазме?
Текущие настройки:
-server -Xms8g -Xmx8g -XX:MaxMetaspaceSize=3200m -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=1000
-XX:+DisableExplicitGC -XX:+PrintGCDetails
-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=7 -XX:NewSize=5004m
-XX:MaxNewSize=5004m -XX:MaxTenuringThreshold=12
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintFlagsFinal
-XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution
-XX:+PrintGCCause -XX:+PrintAdaptiveSizePolicy
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=200M
Также приложение сильно использует отражение. Также мы используем пользовательский загрузчик классов. Все они отлично работали в java 7.