Java, Как мне узнать, какой класс или метод использует много памяти? - PullRequest
0 голосов
/ 16 января 2019

enter image description here

Это однодневная кривая памяти для моего Java-проекта. Как узнать, какой класс или метод использует много памяти?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

0 голосов
/ 16 января 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...