2015-08-11 1 views
3

Я использую Spring Boot 1.2.5 с Java 1.8.0_51, и когда приложение запущено и работает, metaspace продолжает расти со скоростью 10 МБ в час. Похоже на утечку класса или что-то еще, я просто не могу понять, что вызывает его.Spring Boot Metaspace Memory Leak

Приложение работает с Jetty вместо Tomcat.

У меня запущен цикл событий Reactor и несколько запланированных процессов. Однако это происходит, когда я отказываюсь от них.

Вот некоторые из библиотек, которые я использую:

spring-boot-starter-actuator 
spring-boot-starter-aop 
spring-boot-starter-data-jpa 
spring-boot-starter-data-rest 
spring-boot-starter-security 
reactor-spring-context 
hibernate-ehcache 
+0

вы должны отслеживать загрузку классов, разгрузку классов и детали GC, чтобы узнать, получают ли какие-либо загрузчики классов GCed. вы также должны регистрировать/визуализировать размер метаданных с течением времени. Возможно, что он просто не достиг отметки о высокой воде, требующей сбора. – the8472

+0

Спасибо за ваш комментарий Suseika. Я просто проследил загрузку класса, и я не вижу ничего странного. В последний час я просто загрузил 10 классов, но память увеличилась на 10 МБ. В настоящее время у меня установлен Metaspace max до 200 МБ, для кучи, которая работает без проблем с 500 МБ, и в итоге она попадает в 200 МБ, и приложение падает. –

+0

У вас есть исполнительный механизм на месте, то есть статистика записи и по умолчанию делает это в памяти ... Вы также используете кеширование (судя по включению «hibernate-ehcache», убедитесь, что ваши кеши очищены/обновлены правильно Но в целом, удалите анализатор и проанализируйте поведение вашего приложения. –

ответ

0

Одним из наиболее распространенных сбоев, связанных с памятью, которые происходят в Jetty веб-сервиса (следовать Превышение максимального количества собственных потоков проблема и Превышение пропускной способности проблемы кучи) составляет , превышающей емкость перменца (где классы выделены, преобразованы в MetaSpace в JDK 1.8).

Превышение Вместимость PermGen пространства

Причины:
- приложения, установленные на Jetty создавать классы динамически и PermGen/Метапространстве пространство должно быть увеличено.
- Библиотека или фрагмент кода приложения динамически создает неограниченное количество классов, которые не имеют права на сбор мусора.

Пример:
MessagePack генерирует классы шаблонов для каждого экземпляра MessagePack, где эти шаблоны экземпляров кэша для каждого экземпляра. Если приложение создает слишком много экземпляров MessagePack, вполне вероятно, что будет создано слишком много классов, что в конечном итоге приведет к сбою памяти.

Диагноз:
Наиболее эффективный способ для диагностики проблем, связанных с памятью на веб-службы Jetty является подключение к нему через JMX и контролировать его с помощью jconsole. По умолчанию JMX не включен на Jetty, но Spring Boot provides monitoring and management over JMX out of the box.

Я только угадываю, но в случае вашего приложения причиной проблемы может быть то, как вы используете ehcache.

+0

Спасибо Karol Król, я думаю, что вы правы, metaspace выглядит более стабильно, используя экземпляр Tomcat вместо Jetty. –