Java, как узнать, какой класс или метод ИСПОЛЬЗУЕТ много памяти?

Java, как узнать, какой класс или метод ИСПОЛЬЗУЕТ много памяти?

Это однодневная кривая памяти для моего проекта Java. Как узнать, какой класс или метод ИСПОЛЬЗУЕТ много памяти?

вот так - docs.oracle.com/javase/8/docs/technotes/guides/visualvm/…

Scary Wombat 16.01.2019 02:49

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

MLM520 16.01.2019 02:58

Например, какой метод создает этот объект String

MLM520 16.01.2019 03:01

Как вы собираете данные, показанные на вашем графике? Источник важен.

Thorbjørn Ravn Andersen 16.01.2019 03:35

Я использовал JavaMelody в этом проекте, но не все проекты использовали его, поэтому я хотел найти общий способ. Я использовал JavaMelody для этого проекта,

MLM520 16.01.2019 07:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 282
2

Ответы 2

Вам нужен инструмент, который может делать Профилирование распределения JVM.

Java Flight Recorder (JFR) может помочь вам с низкими накладными расходами при профилировании распределения (1, 2 - документы для более старых версий, пользовательский интерфейс теперь выглядит совсем по-другому, но слова «Allocations» и «TLAB» по-прежнему используются для поиска материала). Убедитесь, что профилирование распределения включен в настройках, которые вы используете. Это коммерческая функция до OpenJDK 11. Говорят, что и в наши дни некоторые другие инструменты могут делать это с низкими накладными расходами (например, асинхронный профилировщик).

Если вас не волнует, что ваше приложение становится необычно медленным и работает с JDK <11 (?), VisualVM раньше мог показать вам трассировку стека выделений. Я не могу найти его в последней версии (на данный момент 1.4.2), но могу найти его в JVisualVM, поставляемом с моим Oracle JDK 8-something. «Профайлер»> отметьте «Настройки»> «Настройки памяти»> отметьте «Трассы стека распределения записей». Начните профилирование, подождите, подождите, подождите, определите самые большие выделения, щелкните правой кнопкой мыши «Сделать снимок и показать трассировки стека распределения». Похоже на YourKit делает в основном то же самое, а также на JProfiler (они называют это «записью распределения»). Опять же: сильно замедляет работу приложения, поэтому не используйте его в продукте.

Вы должны периодически создавать дамп кучи и анализировать их с помощью таких инструментов, как MAT-Memory Analyzer Tool (https://www.eclipse.org/mat/). Инструмент предоставляет информацию о том, какой объект / класс занимает больше памяти, из какого потока он создан и т. д.

Как узнать, из какого потока создан конкретный объект?

  1. В MAT щелкните гистограмму - она ​​покажет список классов, доступных в дампе. Чтобы продемонстрировать, позвольте мне отфильтровать только класс java.lang.String

  1. Щелкните правой кнопкой мыши любое имя класса, во всплывающем окне выберите Список объектов ---> с исходящими ссылками

  1. Выше шага перечисляются все экземпляры выбранного класса. Щелкните правой кнопкой мыши любое имя класса и во всплывающем окне выберите Объединить кратчайшие пути к корням сборщика мусора ---> со всеми ссылками

  1. После вышеуказанного шага вы можете увидеть, из какого класса Thread создан конкретный объект.

"и из какого потока он создан" - в прошлый раз я не нашел эту информацию в дампе кучи, может подскажете, где искать?
starikoff 24.01.2019 23:10

@starikoff, обновил ответ на вопрос "из какого потока он создан".

Ramesh Subramanian 25.01.2019 07:21

Спасибо за подробный комментарий и за ваши усилия! Я думаю, что, хотя вы немного неправильно смотрите на вещи: этот поток - это то, что имеет ссылку на объект во время дампа (это своего рода определение «корня сборщика мусора»). И не все объекты на этом этапе будут иметь Thread в качестве корня сборки мусора; на самом деле, скорее всего, не будет, посмотрите примеры некоторых из ваших (не JVM) классов.

starikoff 25.01.2019 09:22

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