Это однодневная кривая памяти для моего проекта Java. Как узнать, какой класс или метод ИСПОЛЬЗУЕТ много памяти?
Спасибо, я знаю об этом инструменте, но мой руководитель хочет знать, какие методы отвечают за использование большого количества памяти в определенное время и какие методы генерируют большое количество объектов в куче.
Например, какой метод создает этот объект String
Как вы собираете данные, показанные на вашем графике? Источник важен.
Я использовал JavaMelody в этом проекте, но не все проекты использовали его, поэтому я хотел найти общий способ. Я использовал JavaMelody для этого проекта,




Вам нужен инструмент, который может делать Профилирование распределения 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/). Инструмент предоставляет информацию о том, какой объект / класс занимает больше памяти, из какого потока он создан и т. д.
Как узнать, из какого потока создан конкретный объект?
java.lang.String@starikoff, обновил ответ на вопрос "из какого потока он создан".
Спасибо за подробный комментарий и за ваши усилия! Я думаю, что, хотя вы немного неправильно смотрите на вещи: этот поток - это то, что имеет ссылку на объект во время дампа (это своего рода определение «корня сборщика мусора»). И не все объекты на этом этапе будут иметь Thread в качестве корня сборки мусора; на самом деле, скорее всего, не будет, посмотрите примеры некоторых из ваших (не JVM) классов.
вот так - docs.oracle.com/javase/8/docs/technotes/guides/visualvm/…