Почему в Java 8 со временем увеличивается метапространство классов?

Я запускаю приложение Tomcat (которое состоит из Hibernate + EhCache). Это типичное веб-приложение ORM, которое не должно создавать много классов. Тем не менее, Native Memory Tracking говорит "нет".

В течение последних 24 часов мое веб-приложение создает в среднем ~1 новый класс в час в Metaspace, с максимумом 11 классов в час и 4 часа без создания классов.

Итак, я начал с 7449 занятий, через 24 часа у меня было 7481 занятий. После создания полной GC количество классов может уменьшиться на 0-2, но в целом остается неизменным.

Так

  1. Если классы загружаются лениво, как я могу оценить общее количество классов, которые будут созданы в собственной памяти?

    • Я знаю, что Hibernate создает прокси-классы. Есть ли способ предсказать количество прокси-классов?
    • Как заставить JVM загружать все классы с нетерпением?
  2. Как я могу войти, какие новые классы были загружены в 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

Другие вопросы по тегам