Примечание. Эта статья является оригинальной, и пересылка должна быть воспроизведена полностью и отмечена оригинальной ссылкой.
Анализ памяти JVM часто выполняется более старшими студентами в команде.В 3 статьях этой серии мы глубоко анализируем и помогаем читателям полностью понять использование MAT. Даже не имея практического опыта анализа памяти JVM, вы можете быстро стать экспертом по анализу памяти!
Вот три статьи из этой серии:Эта статья является первой вводной статьей:
- «Углубленное объяснение и практика использования инструмента MAT для анализа памяти JVM — введение»Знакомство с функциями продукта MAT, основными понятиями, сравнением с другими инструментами, кратким руководством.
- «Углубленное объяснение и практика использования инструмента анализа памяти JVM MAT — расширенная глава»Подробно раскройте и представьте основные функции MAT, а также объясните в конкретных реальных боевых сценариях, чтобы помочь вам углубить свое понимание.
- «Углубленное объяснение и практика использования инструмента MAT для анализа памяти JVM — статьи высокого уровня»Суммируйте систематический метод анализа сложных проблем с памятью, и улучшить практические способности каждого через всеобъемлющее дело.
1. Введение в инструмент MAT
MAT (полное название: Memory Analyzer Tool) — это быстрый, удобный и мощный автономный инструмент анализа памяти кучи JVM. Это помогает обнаруживать утечки памяти или оптимизировать логику большого потребления памяти, показывая состояние моментального снимка дампа кучи во время выполнения (дампа кучи), записанного, когда JVM ненормальна (анализ дампа кучи также может выполняться во время нормальной работы).
1.1 Сценарии использования МАТ и основные проблемы
Сценарий 1. Память переполняется, и область кучи JVM или область методов не могут содержать уцелевшие и ожидающие объекты. Например, когда в системе возникает исключение OOM (недостаточно памяти) в периоды пиковой нагрузки, необходимо найти узкое место памяти, чтобы провести оптимизацию.
Сценарий 2: Утечки памяти, объекты, которые больше не будут использоваться, не могут быть собраны сборщиком мусора. Например: Полная сборка мусора происходит после того, как система работала в течение определенного периода времени, и даже после периодического OOM ее необходимо перезапустить вручную.
Сценарий 3. Высокое использование памяти. Например, в системе часто происходит сбор мусора, и необходимо найти причины, влияющие на производительность, стабильность и пропускную способность службы в режиме реального времени.
1.2 Основные понятия
1.2.1 Heap Dump
Дамп кучи — это моментальный снимок кучи процесса Java в определенный момент времени.Он поддерживает форматы HPROF и DTFJ.Первый создается JVM серии Oracle, а второй — JVM серии IBM. Его содержание в основном включает следующие категории:
-
Информация об экземплярах всех объектов: имя класса, к которому принадлежит объект, атрибуты базового типа и ссылочного типа и т. д.
-
Вся информация о классе: загрузчик класса, имя класса, отношения наследования, статические свойства и т. д.
-
GC Root: GC Root представляет собой начальный набор, который определяет, являются ли объекты JVM живыми или нет, посредством анализа достижимости. JVM принимает режим Tracing GC.Объекты, которые могут быть связаны по ссылке из всех корней GCОн жив (и не подлежит переработке), а остальные недостижимые объекты (недостижимые объекты: если невозможно найти путь ссылки от корня GC для достижения объекта, объект является недостижимым объектом) могут быть переработаны.
-
Стек потоков и локальные переменные: кадры стека потоков всех потоков во время создания моментального снимка и локальные переменные каждого стека потоков.
1.2.2 Shallow Heap
Мелкая куча представляет собойСама структура объектаРазмер занимаемой памяти, за исключением памяти, занимаемой его объектом ссылки на атрибут. Например, Shallow Heap объекта java.util.ArrayList содержит 8-байтовый заголовок объекта, 8-байтовую ссылку атрибута массива объектов elementData, 4-байтовый атрибут размера и 4-байтовый атрибут modCount (унаследованный от AbstractList). и заголовок объекта занимает объем памяти), некоторые объекты могут нуждаться в выравнивании и заполнении, но сам ArrayList уже выровнен и не нуждается в дополнении.Обратите внимание, что объем памяти, занимаемый конкретными данными elementData, не учитывается.
1.2.3 Retained Set
Сохраненный набор объекта относится к набору всех объектов, которые могут быть повторно использованы после того, как объект будет утилизирован GC (как показано на рисунке ниже, сохраненный набор G содержит только G и не содержит H, потому что, хотя H является также ссылается на G, так как на H также ссылается F, H не может быть освобожден, когда G очищается сборщиком мусора); кроме того, когда объект не может быть собран сборщиком мусора, его сохраненный набор не может быть собран сборщиком мусора.
1.2.4 Retained Heap
Retained Heap — это размер освобождаемой памяти после освобождения объекта сборщиком мусора, который равен сумме Shallow Heaps всех объектов в Retained Heap освобожденного объекта (как показано на рисунке ниже, Retain Heap of E — сумма мелких куч G и E, такая же, как сумма мелких куч G и E), теория не содержит H).
1.2.5 Dominator tree
Если все пути к объекту Y проходят через объект X, то X доминирует над Y (на следующем рисунке и C, и D доминируют над F, но G не доминирует над H). Дерево доминаторов представляет собой общую дендрограмму, сгенерированную на основе ссылок на объекты и отношений доминирования.Дерево доминаторов четко описывает зависимости между объектами.Дерево доминаторов слева на рисунке ниже показано на схеме дерева доминаторов в правом нижнем углу рисунка ниже. Отношения доминирования также имеют следующие отношения:
-
Поддерево любого узла в дереве Доминатора — это набор узлов, в которых доминирует этот узел, то есть его Retain Set.
-
Если X непосредственно доминирует над Y, то все доминирующие узлы X доминируют над Y.
1.2.6 OQL
OQL — это унифицированный язык запросов для MAT, аналогичный SQL, который может запрашивать и фильтровать данные, такие как классы или объекты в файлах дампа, в соответствии со сложными условиями запроса.
1.2.7 references
Исходящие и входящие ссылки могут напрямую влиять на зависимости между объектами, а MAT также обеспечивает быстрые операции в цепочке.
-
исходящие ссылки: внешний объект, на который ссылается объект (обратите внимание, что атрибут базового типа объекта не включен. Содержимое базового атрибута можно просмотреть в инспекторе).
-
входящие ссылки: объекты, которые напрямую ссылаются на текущий объект, и каждый объект может иметь 0 или более входящих ссылок.
2. Обзор и сравнение функций MAT
2.1 Обзор функции MAT
Примечание. Возможности продукта MAT очень богаты. В этой статье кратко описаны функции продукта, чтобы помочь вам понять всю картину. В следующей статье «Расширенная практика анализа памяти JVM — основные функции и сценарии приложений» будут представлены основные функции. Подробно Сценарии, кейсы, лучшие практики и т.д.
Принцип работы MAT заключается в создании различных индексов для файлов дампа и на основе индекса для достижения [1] распределения памяти, [2] зависимостей между объектами (таких как отношение ссылки на объект объекта, отношение ссылки на поток, отношение ссылки ClassLoader и т. д.), [3] Четыре основные функции состояния объекта (занимаемый объем памяти, значения атрибутов поля и т. д.), [4] условный поиск (OQL, регулярный запрос на сопоставление и т. д.) визуализируются, чтобы помочь разработчикам понять общая картина памяти кучи JVM.
2.1.1 Распределение памяти
-
Глобальная обзорная информация: размер динамической памяти, количество объектов, количество классов, количество загрузчиков классов, количество корней GC, обзор потоков и другая глобальная статистика.
-
Дерево доминаторов: сортировка по Retain Heap объекта, а также поддержка кластеризации статистики по нескольким измерениям, одна из наиболее часто используемых функций.
-
Гистограмма: отображает долю памяти каждого экземпляра класса, включая его собственное использование памяти (неглубокая куча) и использование памяти доминирующими объектами (сохранение кучи), поддерживает статистику кластеризации по пакету, загрузчику класса, суперклассу и классу, наиболее часто использовал одну из функций.
-
Подозреваемые в утечке: прямое попадание в подозрительные объекты, которые занимают много памяти в цепочке ссылок, что может решить некоторые основные проблемы, но сложные проблемы часто не помогают.
-
Основные потребители. Покажите, какие классы, какие загрузчики классов и какие пакеты занимают наибольшую долю памяти.
2.1.2 Зависимость между объектами
-
Ссылки: Обеспечивает отношение внешней ссылки и отношение ссылки объекта. С помощью прямых и косвенных ссылок на любой объект (в основном значения атрибутов и использование памяти) он предоставляет полные сведения о ссылках на зависимости.
-
Дерево доминаторов: поддерживает сортировку по Retain Heap объекта и предоставляет подробные отношения доминирования.В сочетании со ссылками может быть достигнут быстрый анализ ассоциаций больших объектов;
-
Обзор потоков: показывает подробное состояние кадра стека потоков при создании дампа файла дампа, а также предоставляет связанную информацию о памяти, такую как Retain Heap каждого потока.
-
Путь к корням GC: Предоставляет сведения о связи любого объекта с корнем GC, чтобы помочь понять причину, по которой он не может быть повторно использован GC.
2.1.3 Состояние объекта
-
Ядром является предоставление информации об атрибутах объекта, информации об отношениях наследования классов и других данных через панель инспектора, чтобы помочь проанализировать взаимосвязь между высоким использованием памяти и бизнес-логикой.
-
Обнаружение состояния коллекции, например: обнаружение потерь памяти, вызванных пустой коллекцией и пустым массивом, с помощью ArrayList или скорости заполнения массива, определение разумности стратегии хеширования с помощью частоты конфликтов HashMap и т. д.
2.1.4 Извлечение объектов по условию
-
OQL: Предоставляет унифицированный структурированный язык запросов на уровне объекта (класса), аналогичный SQL. Например: найти size=0 и неиспользуемый ArrayList: выбрать * из java.util.ArrayList, где size=0 и modCount=0, найти все свойства длины строки: выбрать s.length из instanceof String s.
-
Многие функции распределения памяти и зависимости между объектами поддерживают такие операции, как поиск по строке и поиск по регулярности.
-
При адресации по адресу виртуальной памяти объект находит по его шестнадцатеричному адресу.
Кроме того, для облегчения памяти и обзора были организованы следующие карты мозга:
2.2 Сравнение распространенных инструментов анализа памяти
На рисунке ниже Y указывает на поддержку, N указывает на отсутствие поддержки, а время указано на момент публикации.
| Особенности продукта | MAT | JProfiler | Visual VM | jhat | jmap | hprof |
|---|---|---|---|---|---|---|
| Анализ ассоциаций объектов, глубокая и мелкая куча, GC ROOT, обнаружение утечек памяти, анализ потоков, предоставление пользовательских программных расширений | Y | N | N | N | N | N |
| Офлайн глобальный анализ | Y | N | Y | Y | N | N |
| выделение памяти в реальном времени | N | Y | Y | Y | Y | Y |
| OQL | Y | N | Y | N | N | N |
| Стек распределения памяти, соотношение горячих точек | N | Y | N | N | N | N |
| Анализ памяти вне кучи | N | N | N | N | N | N |
Примечание 1: Файл дампа содержит распределение объектов Java в памяти кучи на момент создания дампа снимка, но снимок представляет собой только мгновенную запись, поэтому он не содержит такой информации, как когда и каким методом объект было выделено.
Примечание 2: Общее расследование переполнения памяти вне кучи можно совмещать с исследованием gperftools и btrace, есть много таких статей, которые не будут представлены.
3. Быстрый старт и советы
3.1 Quick Start
Примечание. Существует множество статей по быстрому запуску, в этой статье основное внимание уделяется процессу установки и навыкам использования.
1. Устанавливаем МАТ: тыкаем [ссылка для скачивания]; также можно напрямую интегрировать в Eclipse IDE (путь: Eclipse → Help → Eclipse Marketplace → поиск «MAT»).
2. Отрегулируйте размер памяти кучи MAT: MAT также работает как процесс Java во время анализа.Если памяти достаточно, рекомендуется выделить как минимум размер файла дампа * 1,2 раза больше памяти для MAT, чтобы анализ скорость будет выше. Способ состоит в том, чтобы изменить файл MemoryAnalyer.ini и настроить параметры Xmx (Windows может использовать артефакт поиска для поиска и изменения всего программного обеспечения, MAC OS обычно находится в /Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini, если вы не можете найти его, вы можете использовать программное обеспечение Alfred для запроса и изменения).
3. Получите файлы дампа кучи (сначала необходимо выполнить полную сборку мусора для дампов кучи, обратите внимание на влияние при использовании онлайн-сервисов), как правило, тремя способами:
-
Используя инструмент jmap, предоставляемый JDK, введите команду jmap -dump:format=b,file=filename ID процесса. Когда процесс близок к завершению, вы можете добавить параметр -F для принудительного создания дампа: jmap -F -dump:format=b,file=filename Идентификатор процесса.
-
Процесс Java, работающий локально, может быть получен непосредственно с помощью функции File → accquire heap dump в MAT.
-
Настройте параметр JVM при запуске процесса Java: -XX:-HeapDumpOnOutOfMemoryError При возникновении OOM файл дампа будет создан автоматически без ручного вмешательства. Указанный каталог задается параметром -XX:HeapDumpPath=filepath.
4. Проанализируйте файл дампа: Путь Файл → Открыть дамп кучи, а затем MAT создаст индекс и проанализирует его.Когда файл дампа большой, это займет много времени. После анализа в каталоге, где находится файл дампа, появится индексный файл с суффиксом index, а также файл с суффиксом zip в формате HTML.
5. После завершения расчета индекса MAT представляет обзорное представление, состоящее из трех частей:
-
Глобальная обзорная информация, размер динамической памяти, количество классов, количество экземпляров, количество загрузчиков классов.
-
Гистограмма недоступных объектов, показывающая информацию об объекте, которую можно восстановить при сбросе снимков (как правило, не нужно беспокоиться, если GC часто не влияет на анализ сцены в реальном времени)
-
Крупнейшие объекты по сохраненному размеру, который показывает статистику экземпляров, связанных с наибольшим общим объемом памяти и конкретным размером памяти. Как правило, когда соответствующий код относительно прост, часто можно напрямую проанализировать конкретную аномалию ссылки. Например, утечки памяти и т.д. Также включает максимальную поддержку объектов и ссылок для продолжения углубленного анализа.
6. Если код сложный, нужно продолжать использовать различные инструменты MAT и дополнительно анализировать причину исключения памяти в сочетании с бизнес-кодом. Ниже перечислены наиболее часто используемые элементы (конкретные случаи, сценарии и методы использования подробно описаны в «Углубленном объяснении и применении инструмента MAT для анализа памяти JVM — расширенная глава»):
-
Просмотр общего состояния кучи: гистограммы, дерева доминаторов, сведений о потоках и т. д. (запись каждой функции организована следующим образом)
-
Основные потребители, подозреваемые в утечке и т. д., проанализированные MAT
3.2 Используйте навыки и меры предосторожности
1. Обратите внимание на влияние производительности на запущенный процесс: при дампе кучи сначала будет выполняться полная сборка мусора, кроме того, для обеспечения консистентности представления данных объекта необходимо приостановить ответ в безопасной точке Стоп Мир и онлайн-сервис должны обратить внимание на влияние на производительность. Для снижения воздействия можно использовать следующие методы:
-
Отключите входящий трафик перед выполнением действия дампа.
-
Выберите дамп памяти, когда воздействие небольшое.
-
Дамп памяти при захвате указанного события скриптом.
2. Файл дампа и созданный файл индекса могут быть большими. Если машина разработки недостаточно настроена для анализа, вы можете сначала выполнить анализ на сервере и проверить результаты непосредственно на основе проанализированного файла индекса. Кроме того, вам нужно обратить внимание на использование диска:
-
Метод анализа больших файлов: как правило, размер файла дампа не превышает объем основной памяти аналитической машины более чем в 1,2 раза, что может быть непосредственно проанализировано на машине разработки;Если файл дампа слишком велик, вы можете использовать сценарий, предоставленный MAT, для создания индекса на машине с высокой конфигурацией, а затем напрямую отображать результаты анализа индекса.(Обычно это машина с Linux, вы можете использовать сценарий, предоставленный MAT: ./ParseHeapDump.sh $HEAPDUMP, в информации о куче есть мусорные объекты, помеченные как недостижимые, и она также сохраняется во время дампа. По умолчанию эта часть данных не анализируется.При необходимости запуска скрипта добавьте в ParseHeapDump.sh: -keep_unreachable_objects).
-
Если вас не волнуют недостижимые объекты в куче, используйте параметр «live», чтобы уменьшить размер файла.Команда jmap -dump:live,format=b,file=
-
Активно выполняйте ПОЛНУЮ сборку мусора вручную перед созданием дампа, чтобы удалить недействительные объекты и еще больше сократить время создания дампов кучи и индексации.
-
Файл дампа огромен.После индексации обнаружено, что объекты в главном представлении занимают меньше памяти, так как на большинство объектов не ссылается GC Roots и их можно освободить.
-
При создании дампа обратите внимание на указание места на диске с большим пространством, чтобы полные разделы не влияли на службы.
-
Дисковое пространство машины для создания индекса дампа должно быть достаточно большим, как правило, как минимум в два раза больше места для файла дампа, потому что сгенерированный промежуточный файл индекса также имеет большой размер, как показано на следующем рисунке:
3. Другое
-
Проблема с версией JDK: в случае «VMVersionMismatchException» используйте версию JDK, которая запускает целевой процесс.
-
Не отображается основной интерфейс некоторых основных функций.Если проблема достаточно сложная, то необходимо открыть ее.Например, МАТ не открывает инспектор по умолчанию.Если вам нужно провести бизнес-анализ на основе значения данных объекта, рекомендуется открыть этот вид.
-
Параметр HeapDumpOnOutOfMemoryError настроен, но файл дампа не создается автоматически при возникновении ошибки OutOfMemoryError. Возможны три причины:
- Приложение создает себя и выдает OutOfMemoryError
- Другие ресурсы процесса (например, потоки) исчерпаны
- Исчерпание кучи в коде C (например, в исходном коде JVM), которое может возникать по разным причинам, например, в случае недостаточного пространства подкачки, исчерпания ограничения процесса или только ограничения адресного пространства, когда анализ файла дампа времени не является существенным. .
Резюме и перспективы: до сих пор в этой статье объяснялось основное содержание, необходимое для практики MAT.В следующей статье «Углубленное объяснение и практика инструмента MAT для анализа памяти JVM — расширенная глава» будут расширены богатые основные функции MAT. и представлен подробно Каждая функциональная точка Объяснения начнутся с конкретных сценариев, чтобы помочь вам углубить свой опыт и добиться прогресса в реальных боевых сценариях.
Справочное содержание
- Официальный сайт МАТ:help.eclipse.org/2020-09/Индия…
Добро пожаловать в пересылку, обратите внимание, общедоступный номер автора WeChat:Блог Q.Время от времени отправляйте галантерею, практический опыт, сводку системы, интерпретацию исходного кода, технические принципы.