2016-09-05 2 views
7

У нас есть проблема, что наша память без памяти постоянно растет. поэтому мы должны перезапустить наш jee (java8) - webapp каждый третий день (как вы можете видеть на скриншоте здесь: screenshot from non-heap- and heap-memory)Java: анализы без памяти памяти

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

Java-версия

java version "1.8.0_102" 
Java(TM) SE Runtime Environment (build 1.8.0_102-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) 

-версия кот

Apache Tomcat Version 7.0.59 
+0

В комментарии ниже вы говорите, что это встроенный tomcat. Можете ли вы добавить к своему сообщению версию JVM и параметры, используемые для ее запуска? – Aris2World

+0

Также важна версия tomcat – Aris2World

+0

Спасибо @Stefan, если у вас также есть версия встроенного tomcat ... – Aris2World

ответ

0

Как @apangin указывает, похоже, что вы используете больше Метапространстве с течением времени. Обычно это означает, что вы загружаете больше классов. Я бы записывал, какие классы загружаются, а методы компилируются и пытаются ограничить, насколько это делается в процессе производства на постоянной основе. Возможно, у вас есть библиотека, которая постоянно генерирует код, но не очищает его. Именно здесь, глядя на то, какие классы создаются, вы можете дать вам подсказку.


Для нативной памяти без кучи.

Вы можете посмотреть на отображение памяти в Linux с помощью /proc/{pid}/maps. Это позволит вам узнать, сколько виртуальной памяти используется.

Вам нужно определить, связано ли это с

  • увеличения количества потоков, или сокетов
  • прямые ByteBuffers используются.
  • сторонняя библиотека, использующая встроенную/прямую память.

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

+3

Похоже, что графики OP показывают использование памяти как предоставленный [MemoryPoolMXBean] (http://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html). Ни один из потоков, сокетов, прямого байтового буфера или памяти сторонних библиотек не включен в стандартную статистику без кучи. Пулы без кучи - это только кеш кода, метапас и сжатый класс. Вот и все. – apangin

+1

Это интересное наблюдение. Затем он указывает на проблему загрузки класса (например, развертывание нового .war или .ear-файла, где старая версия не была должным образом выпущена, или чрезмерная динамическая генерация и загрузка байт-кода или комбинация). – Codo

+0

мы запускаем j2ee-web-приложение со встроенным tomcat, поэтому нет .war- или .ear-file-deployment –

0

С Java 8 метаданные класса теперь находятся в секции памяти без кучи Metaspace (а не в PermGen). Если ваша память без кучи в основном потребляется Metaspace, вы можете понять это с помощью jstat.

Это не общий инструмент для анализа памяти без кучи. Но это может помочь в вашем случае.

0

Non-кучного использование памяти, как это предусмотрено MemoryPoolMXBean подсчетов следующие пулы памяти:

  • Метапространстве
  • Сжатый Класс Space
  • Код Cache

Другими словами, стандарт не - память памяти памяти включает пробелы, занятые скомпилированными методами и загруженные классы. Скорее всего, увеличение использования памяти без кучи указывает на утечку загрузчика класса.

Использование

  • jmap -clstats PID сбросить статистику загрузчика классов;
  • jcmd PID GC.class_stats, чтобы распечатать подробную информацию об использовании памяти каждого загруженного класса. Последнее требует -XX:+UnlockDiagnosticVMOptions.