Java 8: Почему размер Metaspace увеличивается, но количество загруженных классов остается неизменным?

В нашем приложении, запущенном на Jdk 8, мы используем VisualVM для отслеживания использования загруженных классов и использования метаспаса.

В какой-то момент времени, когда наше приложение работает, мы видим, что количество загруженных классов больше не увеличивается, но метапрограмма по-прежнему увеличивается в размере, пока наша программа работает. Итак, что еще помимо классов хранится в метапассе, что может вызвать это?

Ответы

Ответ 1

Пока ваша программа запущена, некоторые части вашего кода могут быть определены как "горячие" компилятором HotSpot JIT. Это приведет к тому, что эти части будут преобразованы/скомпилированы в собственный код, а также другой встроенный в него код. Это внутреннее представление кода должно куда-то идти, и оно переходит в то же место, что и другие метаданные класса - Metaspace.

Это объясняет непрерывный рост, который вы видите: горячие части определяются с течением времени, используя простой показатель того, сколько раз этот кусок кода был выполнен. Со временем все больше и больше фрагментов кода будут JIT, поскольку они нажмут порог, установленный -XX:CompileThreshold (по умолчанию - 10000)

Ответ 2

Я не уверен, но hier (http://java.dzone.com/articles/java-8-permgen-metaspace) Я финансирую этот

Сбор мусора мертвых классов и загрузчиков классов запускается после того, как использование метаданных класса достигнет "MaxMetaspaceSize".

возможно, это причина увеличения размера метаспазии.