tags: java,troubleshooting,monitor,mat
Вкратце в одном предложении:
MAT
Это мощный инструмент анализа памяти, который может быстро и эффективно помочь нам найти утечку памяти и уменьшить потребление памяти, инструменты анализа, которые будут объяснены ниже.
1. Введение
Как упоминалось в предыдущей статье, использование кучи в памяти находится в центре внимания мониторинга производительности приложений, а для моментального снимка кучи он может быть создан для дальнейшего анализа.В общем, у нас обычно есть три метода создания моментальных снимков дампа кучи:
- Добавьте параметры запуска для автоматического дампа при возникновении OOM:
Параметры запуска java-приложений обычно лучше всего добавить
-XX:+HeapDumpOnOutOfMemoryError
и-XX:HeapDumpPath=logs/heapdump.hprof
, т. е. автоматически сбрасывать моментальные снимки кучи, когда происходит OOM, но этот подход довольно медленный (необходимо подождать до окончания OOM). - Делайте дамп вручную по запросу с помощью команды:
Мы также можем использовать
jmap -dump:format=b,file=HeapDump.hprof <pid>
Инструменты для ручного создания дампов кучи и дампов потоков - Ручной дамп с помощью инструмента:
какпредыдущий постправильно
jconsole
иjvisualvm
Как упоминалось в объяснении, jvisualvm имеет функцию предоставления моментальных снимков кучи дампа, просто нажмите.
Итак, как анализировать сброшенные файлы?jvisualvm
Файлы моментальных снимков могут быть загружены непосредственно для анализа, в то время какMAT
, условно говоря, функция анализа памяти является более мощной, она может автоматически определять места, где могут возникнуть проблемы (особенно переполнение памяти, утечка памяти), а также может проверять использование памяти классом, вызов уровня метода и т. д. в деталь Редкий инструмент для ситуации.
2 Введение в инструменты MAT
MAT (Memory Analyzer tool) — это инструмент для анализа памяти, который представляет собой быстрый и многофункциональный анализатор кучи памяти, который помогает нам находить утечки памяти и анализировать проблемы с высоким потреблением памяти.Официальный сайтДа:https://www.eclipse.org/mat/
, можете посмотреть, если интересно. Используя MAT, можно легко реализовать следующие функции:
- найти самый большой объект, так как MAT обеспечивает разумный совокупный размер для отображения (
retained size
) - Исследуйте графы объектов, в том числе
inbound
иoutbound
Ссылки, то есть то, что ссылается на этот объект и что этот объект вызывает. - Находит объекты, которые нельзя восстановить, может вычислить путь от корня сборщика мусора до связанных объектов
- Найдите пустую память, такую как избыточные объекты String, пустые объекты коллекции и т. д.
3 Установка инструмента MAT
MAT
Есть два способа установки, один из нихeclipse
Установка плагина, одна из них - независимая установка. существуетMAT
изофициальная документацияЕсть соответствующие установочные файлы для загрузки, адрес загрузки:https://www.eclipse.org/mat/downloads.php
- Если он установлен с помощью плагина eclipse,
help -> install new soft
нажмитеADD
и добавьте адрес плагина во всплывающее окно:http://download.eclipse.org/mat/1.9.0/update-site/
, вы также можете загрузить пакет подключаемого модуля для автономной работы непосредственно на странице загрузки и установить его в автономном режиме. - Самостоятельная установка, под Windows, скачать прямо по системе
Windows (x86)
илиWindows (x86_64)
, вы можете выбрать подходящий вам образ при загрузке, и двойным щелчком установить его.
4 инструмента MAT для использования
MAT
Позиционирование — это инструмент анализа памяти. Его основная функция — анализ снимков памяти, чтобы помочь нам найти возможные переполнения памяти или утечки памяти. Поэтому его основная цель — найти объекты, занимающие большой объем памяти, и найти объекты, которые невозможно восстановить. .Официальный документ МАТ, адрес такой:https://help.eclipse.org/2019-06/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
,правильноMAT
Использование описано, и заинтересованные студенты могут подойти и посмотреть. Следующие основныеMAT
Вводятся общие понятия и часто используемые функции.
В дальнейшем с
java-monitor-example
(https://github.com/mianshenglee/my-example/tree/master/java-monitor-example)
Например, этот пример является простымspring boot
работает, тот что внутриcontroller
серединаuser/oom
интерфейс называетсяservice
объект черезList
Участники продолжают добавлятьUser
объекта, что в конечном итоге приводит кOOM
происходит, параметры запуска приложения-Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${APP_HOME}/logs/heapdump.hprof
.
4.1 Описание концепции, связанной с MAT
4.1.1 Утечки памяти и переполнение памяти
- Утечка памяти: Объект бесполезен (не требуется никакой программной логикой), и на него по-прежнему ссылается корневой элемент. Он не может быть автоматически переработан сборщиком мусора. Необходимо выяснить место и причину утечки кода. чтобы быть уверенным раствор;
- Переполнение памяти: Объекты в памяти все еще живы, и места для выделения кучи JVM недостаточно.Необходимо проверить размер настройки кучи (-Xmx и -Xms), а также имеет ли код длительный жизненный цикл объекта и долгое время пребывания в состоянии.
4.1.2 Ссылки (сильная ссылка, мягкая ссылка, слабая ссылка, виртуальная ссылка)
-
Strong Ref
(Сильная ссылка): ссылка со строгой достижимостью. Объект хранится в памяти. Только после удаления сильной достижимости объект может быть переработан. Обычно мы пишем код Strong Ref. -
Soft Ref
(Мягкая ссылка): в соответствии с мягкой доступностью, пока имеется достаточно памяти, объект будет храниться до тех пор, пока память не будет заполнена и не будет сильной ссылки. Как правило, его можно использовать для реализации кэширования, реализуемого через класс java.lang.ref.SoftReference. -
Weak Ref
(Слабая ссылка): слабее, чем Мягкая ссылка.Когда обнаруживается, что Сильная ссылка отсутствует, объект немедленно восстанавливается, не дожидаясь, пока память станет жесткой. Реализуется через классы java.lang.ref.WeakReference и java.util.WeakHashMap. -
Phantom Ref
(Виртуальная ссылка): в памяти вообще не хранится ни один объект, вы можете использовать только сам Phantom Ref. Обычно он используется для выполнения специального процесса очистки после входа в метод finalize(), который реализуется java.lang.ref.PhantomReference.
4.1.3 shallow heap
иretained heap
-
shallow heap
: Размер памяти, занимаемой самим объектом, то есть сумма заголовка объекта и переменных-членов (не значения переменных-членов), например, ссылка занимает 32 или 64 бита, целое число занимает 4 байта, Long занимает 8 байт и т.д. Например, простой класс имеет только одну переменную-член.int i
, то этот классshallo size
составляет 12 байт, поскольку заголовок объекта имеет размер 8 байт, переменные-членыint
составляет 4 байта. Неглубокий размер обычного объекта (не массива) определяется количеством и типом его переменных-членов, а неглубокий размер массива определяется типом элементов массива (тип объекта, базовый тип) и длиной массив. -
retained heap
: Если объект освобождается, размер кучи, занимаемый всеми объектами (в том числе рекурсивно выпущенными), на которые ссылаются и которые освобождаются, будет уменьшен за счет освобождения объекта, то есть объект X может быть GC после того, как он будет утилизирован мусором. коллектор Сумма всех объектов, удаленных из памяти. По сравнению с мелкой кучей сохраненная куча может более точно отражать фактический размер объекта (если объект освобожден, сохраненная куча может быть освобождена).
4.1.4 outgoing references
иincoming references
-
outgoing references
: представляет выходной узел объекта (объект, на который ссылается объект). -
incoming references
: Указывает входной узел объекта (объект, который ссылается на объект).
4.1.5 Dominator Tree
Преобразование дерева объектов вDominator Tree
Это может помочь нам быстро найти блок, который занимает больше всего памяти, а также может помочь нам проанализировать зависимости между объектами.Dominator Tree
Существует несколько определений:
- Объект Х
Dominator
(доминирует) над объектом Y тогда и только тогда, когда все пути к Y в дереве объектов должны проходить через X - Прямой объект Y
Dominator
, относится к ближайшему Y в дереве объектовDominator
-
Dominator tree
Он строится с использованием дерева объектов. существуетDominator tree
Каждый объект в его непосредственномDominator
дочерний узел .
дерево объектов иDominator tree
Соответствующее соотношение выглядит следующим образом:
Как показано на рисунке выше, поскольку и A, и B относятся к C, при освобождении A память C не освобождается. Таким образом, эта память не будет рассчитываться в Retained Heap A или B, поэтому дерево объектов преобразуется вDominator tree
, A, B и C равны.
4.1.6 Корни сборки мусора (корень GC)
При выполнении GC судят по достижимости объекта, следует ли истребовать объект.Достижим ли объект, то есть связана ли ссылка на объект сGC Root
связанный. ОдинGC root
Относится к объектам, к которым можно получить доступ из-за пределов кучи, объект может бытьGC root
объект.
-
System Class
: классы, загруженные загрузчиком классов bootstrap/system, например java.util.* в rt.jar. -
JNI Local
: параметр переменной или метода в методе JNI. -
JNI Global
: глобальные переменные в методах JNI -
Thread Block
: Переменные в потоках, объекты в живом потоке не должны быть переработаны. -
Thread
: активный поток -
Busy Monitor
: вызовите метод wait(), notify() или синхронизируйте объект, например, вызов synchronized(Object) или текущий объект после входа в синхронизированный метод. -
Java Local
: локальные переменные, такие как входные параметры метода или объекты, созданные внутри метода, которые все еще находятся в стеке потоков. -
Native Stack
: переменная или параметр метода в методе Java. -
Finalizable
: объект ожидает запуска финализатора -
Unfinalized
: объект, который имеет метод finalize, но не финализирован и не находится в очереди финализатора. -
Unreachable
: Через другие объекты, недоступные для root, MAT пометит их как root для анализа и восстановления. -
Java Stack Frame
: кадр стека Java Unknown
4.2 Leak Suspects автоматически анализирует утечки
когда это произойдетOOM
получитьheapdump.hprof
файл или после ручного сброса файла используйтеMAT
открыть файл. После открытия подскажет, выполнять ли отчет об обнаружении утечек памяти по умолчанию (если вы пропустите его при открытии Дампа, вы также можете войти в панель инструментов из других входов.Run Expect System Test -> Leak Suspects
),Как показано ниже:
После выбора «Да» введите содержимое отчета. Это содержимое отчета поможет нам проанализировать места, которые могут быть заподозрены в утечках памяти. Он будет отображать больший совокупный объем использования памяти в виде круговой диаграммы. Как показано ниже:
Как показано выше, в отчете указываетсяUserService
Занимает 76,73% памяти, и эти воспоминания находятся в массиве Object[]. Поэтому весьма вероятно, что количество массивов в этом объекте слишком велико. нажмитеDetails
Вы можете просмотреть более подробную информацию:
Здесь подробно,Shortest Paths To the Accumulation Point
может отображаться наGC roots
кратчайший путь, из которого можно проанализировать, какойGC root
подключенные провода к токуRetained Heap
Объекты, занимающие значительный размер, не могут быть переработаны.В этом примереGC root
является локальной переменной потока (java local
).Accumulated Objects in Dominator Tree
отDominator Tree
Для представления удобно видеть, какой из объектов, «доминирующих» над текущим объектом, занимает наибольшую Retained Heap. На рисунке видно, что объектыArrayList
в, покаArrayList
подObject
массив, под массивом находитсяUser
объект. Это может сказать, где проблема. Вам нужно посмотреть код для этого местоположения, чтобы узнать, что вызвало сохранение этого массива.User
причина передозировки.
Примечание. В каталоге исходного файла дампа кучи
MAT
Содержимое отчета было сжато и упаковано в ZIP-файл с именем "xxx_Leak_Suspects.zip". Весь отчет представляет собой файл в формате HTML, который можно открыть и просмотреть непосредственно в браузере, что может облегчить распространение отчета и обмен им.
4.3 Представление гистограммы для просмотра количества и размера объектов
нажмитеOverview
страницаActions
«Просмотр гистограммы» в области или нажмите кнопку «гистограмма» на панели инструментов, чтобы отобразить список гистограмм, в котором отображается количество экземпляров каждого класса класса, количество занятыхShallow heap
иRetained内存
Размер можно сортировать и отображать отдельно. Как показано ниже:
Shallow Heap
иRetained Heap
Концепция уже обсуждалась.
Для объектов Java его члены в основном являются ссылками. Настоящая память находится в куче, которая выглядит как куча нативных byte[], char[], int[], так что если смотреть только на память самого объекта, то количество очень мало, и в большинстве случаев , в представлении гистограммы классы с большим количеством объектов-экземпляров представляют собой некоторые базовые типы (обычно ранжируются первыми), такие как char[], String, byte[], поэтому невозможно определить конкретный класс или метод, вызывающий утечку памяти только из этих. На приведенном выше рисунке это видно непосредственноUser
Объектов очень много, иногда их не так просто увидеть, можно воспользоватьсяgroup result by
возможноsuper class
,class loader
Ожидание сортировки, особое внимание следует уделить таможеннымclassLoader
,Как показано ниже:
В общем, если в представлении «Гистограмма» отображается большое количество объектов-экземпляров, которые не являются базовыми типами, а являются классами, определяемыми пользователем, или подозрительными классами, необходимо сосредоточиться на просмотре. Для дальнейшего анализа вы можете щелкнуть правой кнопкой мыши и выбрать «Использовать».List objects
илиMerge Shortest Paths to GC roots
и другие функции продолжают бурение данных. вlist objects
Соответственноoutgoing references
иincoming references
, можно узнать ссылки с этого объекта и через какие ссылки на этот объект.Merge Shortest Paths to GC roots
Вы можете исключить все те, которые не являются сильными ссылками, и найти объект дляGC root
ссылочный путь. Конечная цель — найти объект, занимающий наибольшую память, и объект, который нельзя переработать, вычислить путь от корня сборщика мусора до связанного объекта и проверить код по пути объекта, чтобы выяснить проблему.
4.4 Dominator Tree
Посмотреть
нажмитеOverview
страницаActions
Вы можете войти в «Дерево Dominator» в области или нажать кнопку «Открыть дерево Dominator» на панели инструментов.Dominator Tree
Посмотреть. В этом представлении отображается текущая память кучи в измерении экземпляра объекта.Retained Heap
Наиболее занятые объекты и древовидная структура объектов, выживание которых зависит от них. Как показано ниже:
Представление показывает имя объекта экземпляра,Shallow Heap
размер,Retained Heap
размер и текущий объектRetained Heap
процент от всей кучи. Граф имеет древовидную структуру, когда объект на предыдущем уровне перерабатывается, подобъекты, на которые он ссылается, будут перерабатываться.Dominator
Это означает, что когда родительский узел перерабатывается, дочерний узел также будет переработан. С помощью этого представления вы можете легко узнать заполняемостьRetained Heap
Несколько объектов с наибольшим объемом памяти и укажите, какие объекты активны из-за каких объектов. В этом примере видно, чтоUserService
серединаArrayList
Ссылочный массив хранит слишком многоUser
объект.
4.5 Представление потоков для просмотра текущего состояния стека потоков
Нажмите кнопку «шестеренка» на панели инструментов, чтобы открытьThread Overview
Просмотр, вы можете просмотреть информацию о кадре стека потока, включая информацию об объекте потока/стеке потока, имя потока,Shallow Heap
,Retained Heap
, загрузчик классов, является ли это потоком демона и т. д. В сочетании с анализом дампа памяти вы можете увидеть локальные переменные в кадре стека потоков, а также увидеть значения атрибутов локальных переменных в области атрибутов объекта внизу слева. Как в примере выше (shortest paths to GC root
), знайте, что это связано с многопоточностьюThread-12
даGC-root
Он занимает много памяти.В представлении потока вы можете сосредоточиться на его атрибутах, как показано ниже:
Как видно из рисунка выше, этот поток вызываетWithOOM
метод с использованием переменныхUserService
, в то время как переменная используетuserList
, который содержит большое количествоUser
объект, заниматьretained heap
очень большой.
5 Резюме
Для анализа памяти java-приложений необходимо сделать дамп памяти java-приложений.После создания снимков памяти используйтеMAT
Выполните анализ, чтобы найти большие объекты, найти утечки или переполнения памяти, проанализировать код и решить проблему. Эта статья оMAT
Сценарии использования, основные понятия, установка и использование . С помощью этой статьи я надеюсь помочь вам анализировать память более удобно и эффективно, а также решить проблему сбоя памяти в Java-приложениях.
Информация о параметрах
-
MAT
Официальный сайт:https://www.eclipse.org/mat/
-
MAT
скачать:http://www.eclipse.org/mat/downloads.php
-
MAT
руководство:https://help.eclipse.org/2019-06/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
- Неглубокие и сохраненные размеры:
https://www.yourkit.com/docs/java/help/sizes.jsp
- Используйте Eclipse Memory Analyzer Tool (MAT) для анализа онлайн-ошибок (1) — вид и функции:
https://www.cnblogs.com/trust-freedom/p/6744948.html
- Пример кода адреса:
https://github.com/mianshenglee/my-example/tree/master/java-monitor-example
Связанное Чтение
- мониторинг java-приложений (1) — технология мониторинга приложений, которую должны знать java-программисты
- мониторинг java-приложений (2) - секрет java-команды
- мониторинг приложений Java (3) — освоили ли вы эти инструменты командной строки
- Мониторинг Java-приложений (4) — онлайн-процедуры устранения неполадок
- мониторинг java-приложений (5) - инструмент визуального мониторинга