Оптимизация JVM must know series — инструменты мониторинга

Java JVM

Это вторая статья из серии по оптимизации JVM:


Зная сборку мусора jvm из предыдущей статьи, мы понимаем, как jvm обрабатывает выделение памяти и сборку мусора. Теория — это инструмент, которым можно руководствоваться на практике.При теоретическом руководстве при выявлении проблем знания и опыт являются ключевым фундаментом, а данные могут дать нам основу.

В общих онлайн-проблемах большинство из нас столкнется со следующими проблемами:

  • утечка памяти
  • Процесс внезапно парит процессор
  • тупик потока
  • Медленный ответ... и другие проблемы.

Если вы столкнулись с вышеуказанными проблемами, у вас могут быть различные локальные инструменты для поддержки просмотра в автономном режиме, но в Интернете не так много локальных инструментов отладки для поддержки, как мы можем определить проблему на основе инструментов мониторинга?

Как правило, мы определяем местонахождение на основе сбора данных, а сбор данных неотделим от обработки инструментов мониторинга, таких как журналы выполнения, стеки исключений, журналы GC, снимки потоков, снимки кучи и т. д. Регулярное использование правильных инструментов анализа и мониторинга может ускорить нашу способность анализировать данные, а также находить и устранять проблемы. Мы подробно расскажем ниже.


1. Общие инструменты и инструкции по мониторингу jvm

1. jps: инструмент состояния процесса jvm

jps [options] [hostid]

Если идентификатор хоста не указан, по умолчанию используется текущий хост или сервер.

Параметры параметров командной строки описаны следующим образом:

-q 不输出类名、Jar名和传入main方法的参数

- l 输出main类或Jar的全限名

-m 输出传入main方法的参数

- v 输出传入JVM的参数

Например:


2, jstat: инструмент мониторинга статистики jvm

jstat — это инструмент командной строки для просмотра различной информации о рабочем состоянии виртуальных машин. Он может отображать в локальном или удаленном процессе виртуальной машины текущие данные, такие как загрузка классов, память, сборка мусора, jit-компиляция и т. д. Это предпочтительный инструмент для определения производительности jvm в Интернете.

Формат команды:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。

outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。

Варианты параметров:

Option

Displays

Ex

class

Статистика просмотра загрузки классов

jstat -class pid: отображает такую ​​информацию, как количество загруженных классов и занимаемое ими место.

compiler

Просмотр статистики компиляции JIT-компилятора в HotSpot

jstat -compiler pid: отображает такую ​​информацию, как количество компиляций виртуальной машины в реальном времени.

gc

Просмотр статистики сборки мусора кучи в JVM

jstat -gc pid: может отображать информацию о сборщике мусора, проверять количество сборщиков мусора и время. Последние пять пунктов — это количество молодых сборщиков мусора, время молодых сборщиков мусора, количество полных сборщиков мусора, время полных сборщиков мусора и общее время сборов мусора.

gccapacity

Просмотр емкости хранилища молодого поколения, старого поколения и постоянного поколения

jstat -gccapacity: может отображать использование и размер объектов трех поколений (молодые, старые, постоянные) в памяти виртуальной машины.

gccause

Просмотрите статистику сборки мусора (это то же самое, что и опция -gcutil), если есть сборка мусора, она также покажет причину последней и текущей сборки мусора, которая произошла.

jstat -gccause: показать причину gc

gcnew

Проверьте ситуацию с вывозом мусора молодого поколения

jstat -gcnew pid: новая информация об объекте

gcnewcapacity

Используется для просмотра емкости хранилища нового поколения

jstat -gcnewcapacity pid: информация о новом объекте и его занятости

gcold

Используется для просмотра вхождений GC в старом поколении и постоянном поколении.

jstat -gcold pid: старая информация об объекте

gcoldcapacity

Используется для просмотра емкости старого поколения

jstat -gcoldcapacity pid: информация о старых объектах и ​​их занятости

gcpermcapacity

Используется для просмотра постоянной генерирующей мощности

jstat -gcpermcapacity pid: информация об объекте perm и его занятости

gcutil

Просмотр состояния сбора мусора молодого, старого и холдингового поколения

jstat -util pid: статистика информация gc статистика

printcompilation

Статистика методов компиляции HotSpot

jstat -printcompilation pid: информация о текущем выполнении ВМ

Например:

Проверьте выполнение статуса gc: jstat-gcutil 27777


3. jinfo: информация о конфигурации Java

Формат команды:

jinfo[option] pid

Например: получить запущенную jvm и информацию о запуске текущего процесса.


4. jmap: инструмент сопоставления памяти Java

Команда jmap используется для создания моментальных снимков дампа кучи. Распечатайте статус всех «объектов» в памяти java-процесса (используя pid) (например: эти объекты сгенерированы и их количество).

Формат команды:

jmap [ option ] pid

jmap [ option ] executable core

jmap [ option ] [server-id@]remote-hostname-or-IP

Варианты параметров:

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. 

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. 

-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. 

-h | -help 打印辅助信息 

-J 传递参数给jmap启动的jvm. 

Например:

Используйте jmap -heap pid для просмотра использования памяти кучи процесса, включая используемый алгоритм GC, параметры конфигурации кучи и использование памяти кучи в каждом поколении:

Используйте jmap -histo[:live] pid для просмотра гистограммы количества и размера объектов в куче памяти.


5, jhat: инструмент анализа снимков кучи jvm

Команда jhat используется вместе с jamp для анализа моментальных снимков кучи, созданных картой. jhat имеет встроенный мини-сервер http/html, который можно просмотреть в браузере. Тем не менее, рекомендуется не использовать его как можно чаще, так как файл дампа есть, его можно вытащить из производственной среды и проанализировать локальными средствами визуализации, что не только снижает нагрузку на онлайн-сервер, но и может быть проанализированы достаточно подробно (такие как MAT/jprofile/visualVm) и т.д.


6. jstack: инструмент трассировки стека Java

jstack используется для создания моментального снимка потока текущего момента виртуальной машины Java. Моментальный снимок потока — это набор стеков методов, которые выполняются каждым потоком в текущей виртуальной машине Java. Основная цель создания снимка потока — определить причину длительных пауз в потоках, таких как взаимоблокировки между потоками. , бесконечные циклы, запросы на внешние ресурсы, время ожидания и так далее.

Формат команды:

jstack [ option ] pid

jstack [ option ] executable core

jstack [ option ] [server-id@]remote-hostname-or-IP

параметр:

-F当’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

Последующие поиски будут использоваться в примере с наибольшей стоимостью процессора.


2. Инструменты визуализации

Общие инструменты визуализации для мониторинга jvm, помимо Jconsole и visualVm, предоставляемых самой jdk, есть jprofilter, perfino, Yourkit, Perf4j, JProbe, MAT и т. д., предоставляемые сторонними организациями. Эти инструменты значительно обогатили наш способ позиционирования и оптимизации JVM.

В Интернете есть много руководств по использованию этих инструментов, поэтому я не буду подробно их описывать. Для VisualVm рекомендуется использовать.Помимо того, что он менее навязчив к jvm, он также разработан командой jdk.Я считаю, что в будущем функции будут более обильными и совершенными. Для сторонних инструментов мониторинга jprofilter предоставляет наиболее полные функции и визуализацию.В настоящее время большинство IDE поддерживают его подключаемые модули, которые можно использовать вместе для отладки и настройки производительности перед подключением к сети.

Кроме того, для кучи информации онлайн-дампа надо попробовать вытащить его в офлайн для анализа средствами визуализации, чтобы анализ был более детальным. Если какие-то неотложные проблемы необходимо отслеживать в режиме онлайн, вы можете использовать удаленную функцию VisualVm для этого, что требует использования функции MAT в файле tool.jar.


3. Применение

1. Процессор парит

Иногда в онлайне может быть проблема, что в определенный момент в приложении вдруг зависает ЦП. В связи с этим нам следует ознакомиться с некоторыми инструкциями и быстро проверить соответствующий код.

1. Найдите процесс, который больше всего потребляет ЦП

指令:top


2. Найдите поток, который потребляет больше всего ЦП в процессе.

指令:top -Hp pid


3. Конвертировать базу

printf “%x\n” 15332 // 转换16进制(转换后为0x3be4) 

4. Отфильтруйте указанный поток и распечатайте информацию о стеке.

指令:
jstack pid |grep 'threadPid'  -C5 --color 

jstack 13525 |grep '0x3be4'  -C5 --color  //  打印进程堆栈 并通过线程id,过滤得到线程堆栈信息。

Видно, что это программа создания отчетов, которая занимает слишком много ЦП (приведенный выше пример является только примером, а само потребление ЦП невелико)


2. Тупик потока

Иногда в сценариях развертывания возникают проблемы взаимоблокировки потоков, но это не является распространенным явлением. На данный момент мы используем jstack, чтобы проверить это. Например, теперь у нас есть программа с блокировкой потока, из-за которой некоторые операции ожидают.

1. Найдите идентификатор процесса Java

指令:top 或者 jps 


2. Просмотрите информацию о моментальном снимке потока процесса Java.

指令:jstack -l pid

Как вы можете видеть из вывода, возникает взаимоблокировка потока, и появляется эта строка кода. Это позволяет быстро устранять неполадки.


3. Утечка памяти ООМ

Исключение OOM в куче java — распространенное исключение переполнения памяти в практических приложениях. Как правило, мы сначала анализируем сброшенный снимок дампа кучи с помощью инструмента анализа отображения памяти (например, MAT), чтобы подтвердить, есть ли проблема с объектами в памяти.

Конечно, причин OOM много, и дело не в нехватке ресурсов приложения в куче. Также возможно, что слишком много ресурсов запрашивается и не освобождается, или ресурсы системы исчерпаны из-за частых обращений. Мне нужно расследовать эти три случая один за другим.


Три случая ООМ:

1. Ресурс приложения (память) слишком мал и не достаточен.

2. Не высвобождается слишком много ресурсов приложения.

3. Слишком много ресурсов приложения и исчерпаны ресурсы. Например: слишком много потоков, слишком большая память потоков и т. д.


1. Устраните неполадки приложения для ресурсов приложения.

指令:jmap -heap 11869 

Проверьте размер выделения и использование памяти кучи нового и старого поколения, чтобы убедиться, что само выделение слишком мало.

Из приведенного выше исследования было обнаружено, что проблем с памятью, запрошенной программой, нет.


2. Проверьте сборку мусора

Особенно в случае с fgc, ситуация с памятью каждого поколения.

指令:jstat -gcutil 11938 1000 每秒输出一次gc的分代内存分配情况,以及gc时间


3. Найдите самый требовательный к памяти объект

指令: jmap -histo:live 11869 | more

В приведенной выше выходной информации максимальный объект памяти составляет всего 161 КБ, что соответствует нормальному диапазону. Если объект занимает большое пространство, например более 100 Мб, вам следует сосредоточиться на анализе того, почему он не освобождается.


Обратите внимание, что приведенная выше команда:

jmap -histo:live 11869 | more

执行之后,会造成jvm强制执行一次fgc,在线上不推荐使用,可以采取dump内存快照,线下采用可视化工具进行分析,更加详尽。

jmap -dump:format=b,file=/tmp/dump.dat 11869 

或者采用线上运维工具,自动化处理,方便快速定位,遗失出错时间。

4. Подтвердите, исчерпаны ли ресурсы

  • pstree Просмотр количества потоков процесса
  • netstat для просмотра количества сетевых подключений

или используйте:

  • ll /proc/${PID}/fd | wc -l // количество открытых дескрипторов
  • ll /proc/${PID}/task | wc -l (тот же эффект, что и pstree -p | wc -l) //Количество открытых потоков


Выше приведены некоторые распространенные командные приложения jvm.

Применение инструмента не является панацеей, он может вылечить все болезни.Решение проблемы часто требует комбинации нескольких инструментов, чтобы лучше локализовать проблему.Независимо от того, какой инструмент анализа используется, самое главное, чтобы быть знакомым с преимуществами каждого инструмента и недостатками. Таким образом, мы можем учиться друг у друга и использовать их вместе.



-----------------------------------------------------------------------------

Если вы хотите увидеть больше интересных и оригинальных технических статей, сканируйте и подписывайтесь на официальный аккаунт.

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