1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/vipshop-VJTools

Клонировать/Скачать
README.md 5.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 21:56 bc1b067

1. Обзор

В проекте cmdline-jmxclient была проведена доработка с целью расширения функциональности:

  • добавлена возможность подключения к JVM по pid, без необходимости открывать JMX в параметрах запуска исходной JVM;
  • полностью имитирован вывод команды jstat -gcutil для случаев, когда использование jstat невозможно или когда jstat вычисляет процент использования памяти на основе «уже выделенной» памяти, а не «максимальной», что может привести к некорректной оценке нехватки памяти.

Поскольку каждый запуск java -jar vjmxclient.jar фактически создаёт новую JVM, в файл vjmxcli.sh были добавлены дополнительные параметры JVM для оптимизации потребления ресурсов.

Скачать vjmxcli-1.0.8.zip

Для корректной работы необходимо использовать ту же версию JDK, что и целевая JVM.

2. Получение значений атрибутов MBean

// Подключение по IP-адресу и порту
./vjmxcli.sh - 127.0.0.1:8060 java.lang:type=Memory HeapMemoryUsage

// Подключение по PID
./vjmxcli.sh - 98583 java.lang:type=Memory HeapMemoryUsage

Параметры:

  • - — пароль отсутствует;
  • 127.0.0.1:8060 или 98582 — адрес приложения и порт JMX, либо PID;
  • java.lang:type=Memory — имя MBean;
  • HeapMemoryUsage — атрибут.

3. Имитация и улучшение вывода jstat gcutil

Иногда использование jstat становится невозможным, например, если целевая JVM использует -Djava.tmp.dir для переопределения временного каталога или -XX:+PerfDisableSharedMem для запрета perfdata. В таких случаях можно использовать vjmxcli в качестве альтернативы jstat.

Также стоит отметить, что в jstat в качестве знаменателя используется уже выделенная память, а не максимально доступная, поэтому при использовании этого процента для оповещения о нехватке памяти могут возникать ложные срабатывания. Например, если текущий объём используемой памяти составляет 95 Мбайт, уже выделенный объём — 100 Мбайт, а максимальный объём — 1 Гбайт, то оповещение о том, что используемая память превышает 90%, будет ошибочным.

Алгоритм vjmxCli заключается в следующем: если для данного региона памяти задано максимальное значение, оно используется в качестве знаменателя, иначе используется уже выделенный объём памяти.

Причина, по которой jstat не использует этот подход, заключается в том, что если Max не задан, JMX возвращает -1, а PerfData возвращает приблизительное большое значение. Поэтому jstat, который считывает только PerfData, не может корректно использовать значение Max.

// Однократный вывод
./vjmxcli.sh - 127.0.0.1:7001 gcutil

// Непрерывный вывод с интервалом в 5 секунд
./vjmxcli.sh - 127.0.0.1:7001 gcutil 5

// Подключение по PID, непрерывный вывод с интервалом в 5 секунд
./vjmxcli.sh - 98583 gcutil 5

Пример вывода для JDK7:

S	      S	      E	     O	     P	   	YGC	YGCT	FGC	FGCT	GCT	
41.25	41.25	2.25	0.00	0.48	2	0.025	0	0.0	   0.025

Пример вывода для JDK8:

S	      S	      E	     O	      M	   CCS	YGC	YGCT	FGC	FGCT	GCT	
41.25	41.25	2.25	0.00	0.48	0	2	0.025	0	0.0	   0.025

4. Приложение

4.1 Часто используемые JMX элементы

Элемент Object Name Attribute Name
Память кучи java.lang:type=Memory HeapMemoryUsage
Некуча (исключая память вне кучи) java.lang:type=Memory NonHeapMemoryUsage
Внекучная память (исключая новую версию Netty, запрашивающую внекучную память) java.nio:type=BufferPool,name=direct MemoryUsed
Количество потоков java.lang:type=Threading ThreadCount
Число потоков демона java.lang:type=Threading DaemonThreadCount
Память поколений и GC разные значения для разных JDK разные значения для разных JDK

4.2 Параметры запуска для включения JMX

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7001  
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=127.0.0.1

При подключении по PID эти параметры заранее определять не нужно.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/vipshop-VJTools.git
git@api.gitlife.ru:oschina-mirror/vipshop-VJTools.git
oschina-mirror
vipshop-VJTools
vipshop-VJTools
master