Это вторая статья из серии по оптимизации 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 |
Статистика просмотра загрузки классов |
jstat -class pid: отображает такую информацию, как количество загруженных классов и занимаемое ими место. |
|
Просмотр статистики компиляции JIT-компилятора в HotSpot |
jstat -compiler pid: отображает такую информацию, как количество компиляций виртуальной машины в реальном времени. |
|
Просмотр статистики сборки мусора кучи в JVM |
jstat -gc pid: может отображать информацию о сборщике мусора, проверять количество сборщиков мусора и время. Последние пять пунктов — это количество молодых сборщиков мусора, время молодых сборщиков мусора, количество полных сборщиков мусора, время полных сборщиков мусора и общее время сборов мусора. |
|
Просмотр емкости хранилища молодого поколения, старого поколения и постоянного поколения |
jstat -gccapacity: может отображать использование и размер объектов трех поколений (молодые, старые, постоянные) в памяти виртуальной машины. |
|
Просмотрите статистику сборки мусора (это то же самое, что и опция -gcutil), если есть сборка мусора, она также покажет причину последней и текущей сборки мусора, которая произошла. |
jstat -gccause: показать причину gc |
|
Проверьте ситуацию с вывозом мусора молодого поколения |
jstat -gcnew pid: новая информация об объекте |
|
Используется для просмотра емкости хранилища нового поколения |
jstat -gcnewcapacity pid: информация о новом объекте и его занятости |
|
Используется для просмотра вхождений GC в старом поколении и постоянном поколении. |
jstat -gcold pid: старая информация об объекте |
|
Используется для просмотра емкости старого поколения |
jstat -gcoldcapacity pid: информация о старых объектах и их занятости |
|
Используется для просмотра постоянной генерирующей мощности |
jstat -gcpermcapacity pid: информация об объекте perm и его занятости |
|
Просмотр состояния сбора мусора молодого, старого и холдингового поколения |
jstat -util pid: статистика информация gc статистика |
|
Статистика методов компиляции 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.
Применение инструмента не является панацеей, он может вылечить все болезни.Решение проблемы часто требует комбинации нескольких инструментов, чтобы лучше локализовать проблему.Независимо от того, какой инструмент анализа используется, самое главное, чтобы быть знакомым с преимуществами каждого инструмента и недостатками. Таким образом, мы можем учиться друг у друга и использовать их вместе.
-----------------------------------------------------------------------------
Если вы хотите увидеть больше интересных и оригинальных технических статей, сканируйте и подписывайтесь на официальный аккаунт.
Сосредоточьтесь на личностном росте и развитии игр, а также способствуйте росту и прогрессу отечественного игрового сообщества.