Почему в Java 8 со временем увеличивается метапространство классов?
Я запускаю приложение Tomcat (которое состоит из Hibernate + EhCache). Это типичное веб-приложение ORM, которое не должно создавать много классов. Тем не менее, Native Memory Tracking говорит "нет".
В течение последних 24 часов мое веб-приложение создает в среднем ~1 новый класс в час в Metaspace, с максимумом 11 классов в час и 4 часа без создания классов.
Итак, я начал с 7449 занятий, через 24 часа у меня было 7481 занятий. После создания полной GC количество классов может уменьшиться на 0-2, но в целом остается неизменным.
Так
Если классы загружаются лениво, как я могу оценить общее количество классов, которые будут созданы в собственной памяти?
- Я знаю, что Hibernate создает прокси-классы. Есть ли способ предсказать количество прокси-классов?
- Как заставить JVM загружать все классы с нетерпением?
Как я могу войти, какие новые классы были загружены в Metaspace?
Моя конфигурация:
Server version: Apache Tomcat/8.0.28
OS Name: Linux
OS Version: 3.14.34-27.48.amzn1.x86_64
Architecture: amd64
JVM Version: 1.8.0_71-b15
JVM Vendor: Oracle Corporation
JVM flags: -Xms512m -Xmx2G -XX:+UseG1GC -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
Hibernate 4.3.1
1 ответ
Есть ли способ предсказать количество прокси-классов
В общем нет. Теоретически приложение может в любой момент выдать байт-код файла класса.
Как заставить JVM загружать все классы с нетерпением?
Ты не можешь Ленивая загрузка классов является одной из функций Java. Что ж, вы можете сканировать путь к классам и загружать все классы из всех JAR-файлов, но это не то, что вы хотите сделать, поскольку в результате появятся тысячи никогда не используемых классов.
Как я могу войти, какие новые классы были загружены в Metaspace?
использование -XX:+TraceClassLoading