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".
возможно, это причина увеличения размера метаспазии.