Java 8: Почему размер Metaspace увеличивается, но количество загруженных классов остается неизменным?
в нашем приложении, работающем на Jdk 8, мы используем VisualVM для отслеживания использования загруженных классов и использования метапространства.
в какой-то момент, когда приложение запущено, мы видим, что количество загруженных классов не увеличить больше, но metaspace еще увеличение его размера пока наша программа работает. Итак, что еще, кроме классов, хранится в metaspace, что может вызвать это?
2 ответов
пока ваша программа работает, некоторые части вашего кода могут быть определены как" горячие " JIT-компилятором HotSpot. Это приведет к тому, что эти части будут преобразованы/скомпилированы в собственный код, а также в него может быть встроен другой код. Это собственное представление кода куда-то идти, и он идет в то же место, как и другие метаданные класса - Metaspace.
это объясняет непрерывный рост, который вы видите: горячие части определяются с течением времени, используя простую метрику того, сколько раз этот кусок кода был выполнен. Со временем все больше и больше фрагментов кода будут JIT'Ed, поскольку они достигнут порога, установленного -XX:CompileThreshold
(по умолчанию 10000)
Я не уверен, но hier (http://java.dzone.com/articles/java-8-permgen-metaspace) я финансирую это
сборка мусора мертвых классов и загрузчиков классов запускается, как только использование метаданных класса достигает "MaxMetaspaceSize".
возможно, это причина увеличения размера метапространства.