
JVMM (JVM Monitor)-это инструмент, который обеспечивает мониторинг виртуальных машин Java и операционных систем Java. It has rich data acquisition functions: OS (memory, CPU, disk status and IO, network card status and IO, etc.), JVM (memory, thread, thread pool, memory pool, GC, class loader, etc.), and also provides functions such as generating flame diagrams, hot updates of Java code, decompilation, etc. Suitable for use in scenarios such as service health monitoring, program tuning, problem investigation, performance testing, etc.
Пожалуйста, перейдите в релизы, чтобы загрузить последнюю версию JVMM и расстегнуть его.
Советы: Некоторые функции JVMM зависят от JDK в местной среде. Пожалуйста, убедитесь, что вы устанавливаете JDK вместо JRE в вашей среде. Простая проверка: выполнить
jps -lв вашей среде. Если он может быть выполнен нормально и выводить результат, это означает, что среда в порядке, в противном случае JVMM может не работать.
Сначала выполните следующую команду, чтобы сгенерировать пакет JAR Service
java -jar jvmm.jar -m jar -sЗатем запустите сервер, пожалуйста, обратите внимание на вашу версию JDK при запуске
# 启动server,jdk 8使用下面命令
java -jar jvmm-server.jar
# jdk 9+ 为确保成功运行建议使用下面命令
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jarЕсли сервер JVMM успешно запускается, он по умолчанию будет работать на порте 5010 , а затем вам нужно настроить новое окно в текущем каталоге для выполнения:
java -jar jvmm.jar -m client -a 127.0.0.1:5010 Если подключение к серверу будет успешным, вы введите режим клиента. Вы можете ввести следующую команду для сбора данных процесса. Конечно, вы можете ввести help для просмотра использования всех исполняемых инструкций в этом режиме.
info -t processВот примеры данных, собранных в режиме клиента JVMM. Функции, предоставленные JVMM, гораздо больше, чем это. Для получения дополнительных функций, пожалуйста, прочитайте документацию по использованию JVMM.
Функция основного сбора данных JVMM находится в модуле core , а функция, ориентированная на службу, находится в модуле server . Согласно вашему сценарию использования, вы можете выбрать следующие два метода использования:
core модуля (больше функций) Прежде всего, вам нужно понять, что может сделать сервер? Сервер предоставляет три режима обслуживания. Перед тем, как использовать его, какой из них вам нужно выбрать, вам больше подходит. Вот три режима обслуживания:
Любой режим обслуживания неотделим от файла конфигурации JVMM.yml. server.type используется для настройки того, какой режим или какой режим вы выберете. Они могут работать одновременно . Конкретные конфигурации каждого режима соответствуют server.jvmm , server.http и server.sentinel .
server :
type : jvmm,http,sentinel # 支持同时开启多种模式
jvmm :
# ...
http :
# ...
sentinel :
# ...Для конфигурации по умолчанию см. Jvmm.yml и информацию о конфигурации см. Комментарии в файле конфигурации.
JVMM предоставляет четыре способа запуска вашего сервера:
-javaagent ) параметр)jvmm-server.jar напрямую (функции горячего обновления декомпиляции и кода не поддерживают)Уведомление! ! !
Независимо от того, в каком способе вы запускаете сервер, если ваша работа в рамках работы JDK 9+ или выше, рекомендуется добавить следующие параметры JVM при запуске, чтобы обеспечить успешную работу.
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
Запустите jvmm.jar и выберите режим прикрепления
java -jar jvmm.jar -m attach -c ./jvmm.ymlЗатем вам будет предложено выбрать номер целевого процесса. После выбора сервер будет запущен в целевом процессе.
Если вы уже знаете PID целевого процесса, вы можете указать его напрямую:
java -jar jvmm.jar -m attach -c ./jvmm.yml -pid 80080
В методе агента Java вам необходимо создать необходимый пакет JAR и использовать параметр -a для указания agent генерации:
# 如果你的宿主程序中包含了 SLF4J 的实现(例如 logback),需要在生成时使用 -e 参数排除掉jvmm自带的 slf4j 实现
java -jar jvmm.jar -m jar -a -e logger
# 如果你的宿主程序中没有 SLF4J 的实现,无需排除 logger
java -jar jvmm.jar -m jar -a После выполнения соответствующий файл будет генерироваться в одном и том же каталоге уровня: jvmm-agent.jar , а затем параметр -javaagent добавляется при запуске целевой программы (при условии, что это app.jar). Формат заключается в следующем:
java -javaagent:<jvmm-agent.jar路径>=config=<jvmm.yml路径> -jar your-app.jar
Например:
java -javaagent:/path/jvmm-agent.jar=config=/path/jvmm.yml -jar app.jarЧтобы быть совместимым с функциональностью использования внешних серверов, полный формат Javaagent:
-javaagent:<jvmm-agent.jar路径>=server=<jvmm-server.jar路径>;config=<jvmm.yml路径>
Когда ваша программа начнется, JVMM начнется как агент

Если вы не хотите прикрепляться к какой -либо программе хоста, вы можете запустить сервер JVMM отдельно, например, в сценарии мониторинга физической машины.
Во -первых, вам необходимо генерировать зависимость от JAR и использовать параметр -s для указания server генерации:
java -jar jvmm.jar -s После завершения выполнения jvmm-server.jar будет сгенерирован в том же каталоге, а затем будет запущен сервер. Пожалуйста, обратите внимание на вашу версию JDK при запуске.
# 启动server,jdk 8使用下面命令
java -jar jvmm-server.jar
# jdk 9+ 为确保成功运行建议使用下面命令
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jarЕсли вы хотите использовать сервер в своем проекте, вам нужно сначала представить зависимости Maven
< dependencies >
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-server</ artifactId >
< version >${jvmm-version}</ version >
</ dependency >
<!-- jvmm日志依赖,如果你的项目中有 SLF4J、Log4J2、Log4J中任意一个依赖,可以去掉此依赖 -->
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-logger</ artifactId >
< version >${jvmm-version}</ version >
</ dependency >
</ dependencies >Начать сервер с одной строкой кода
import org . beifengtz . jvmm . server . ServerBootstrap ;
public class Jvmm {
public static void main ( String [] args ) {
ServerBootstrap . getInstance (). start ();
}
} Конечно, приведенный выше метод запуска будет использовать конфигурацию по умолчанию и, как правило, требует пользовательской конфигурации. Метод getInstance может пройти в объект org.beifengtz.jvmm.server.entity.conf.Configuration . Пользовательская конфигурация может быть реализована путем построения конфигурации.
Подключить JVMM ServerConveyDemo.java с помощью jvmmconnector
Когда сервер запускается в режиме jvmm или http , вы можете удаленно вызвать встроенный интерфейс.

JVMM Service предоставляет следующие интерфейсы API:
| Тип | Данные | Описание |
|---|---|---|
| Jvmm_collect_sys_info | / | Соберите информацию об операционной системе |
| Jvmm_collect_sys_memory_info | / | Собрать данные памяти операционной системы |
| Jvmm_collect_sys_file_info | / | Соберите данные об использовании разделения операционной системы |
| Jvmm_collect_process_info | / | Соберите текущие данные процесса |
| Jvmm_collect_disk_info | / | Соберите данные диска физического машины |
| Jvmm_collect_disk_io_info | / | Соберите диск ввода и пропускной способности физической машины |
| Jvmm_collect_cpu_info | / | Соберите данные загрузки процессора физической машины |
| Jvmm_collect_network_info | / | Соберите информацию о сетевой карте физической машины и данные IO |
| Jvmm_collect_port_status | Jsonarray, чей элемент - номер порта | Соберите использование порта физической машины |
| Jvmm_collect_jvm_classloading_info | / | Соберите информацию о загрузке класса JVM |
| Jvmm_collect_jvm_classloader_info | / | Соберите информацию о загрузке класса JVM |
| Jvmm_collect_jvm_compilation_info | / | Соберите информацию о компиляции JVM |
| Jvmm_collect_jvm_gc_info | / | Соберите информацию о коллекционере мусора JVM |
| Jvmm_collect_jvm_memory_manager_info | / | Собрать информацию о менеджере памяти JVM |
| Jvmm_collect_jvm_memory_pool_info | / | Соберите информацию о пуле памяти JVM |
| Jvmm_collect_jvm_memory_info | / | Соберите использование памяти JVM |
| Jvmm_collect_jvm_thread_info | / | Соберите статистику потока JVM |
| Jvmm_collect_jvm_thread_stack | Смотрите Threadinfodto | Соберите указанные данные стека потоков JVM |
| Jvmm_collect_jvm_thread_detail | Jsonarray, чей элемент является идентификатором потока | Соберите данные потока JVM (время процессора, время блока, замки и т. Д.) |
| Jvmm_collect_jvm_thread_pool | JsonObject, его свойства: ClassLoaderHash (String), Clazz (String), Encemanfield (String), Field (String) | Соберите информацию о пуле потоков JVM |
| Jvmm_collect_jvm_thread_ordered_cpu_time | JsonObject, его свойства: type (String, Stack | info), Durationseconds (int) | Приобретение использования процессора в потоках JVM в течение определенного времени |
| Jvmm_collect_jvm_dump_thread | / | Сбросить все данные стека потоков |
| Jvmm_collect_batch | CollectionType [] | Сбор данных в партиях на основе параметров |
| Jvmm_execute_gc | / | Выполнить GC |
| Jvmm_execute_java_process | / | Перечислите все процессы Java |
| Jvmm_execute_jvm_tool | Нить | Выполнить команду инструмента JVM |
| Jvmm_execute_jad | JsonObject, его свойства: ClassName (String), MethodName (String) | Декомпиляция кода (поддерживаются только агенты) |
| Jvmm_execute_load_patch | Jsonarray, элемент которого является PatchDto | Горячие обновления кода. При указании хэша загрузчика класса, это только горячие обновления для изменения класса, загруженного ClassLoader. |
| Jvmm_execute_switches_get | / | Получите информацию о выключении приобретения |
| Jvmm_execute_switches_set | JSonObject, его свойства: names (Switches []), Open (Boolean) | Установите переключатель приобретения |
| Jvmm_profiler_sample | Смотрите ProfilersAmpledto | Генерировать карту пламени |
| Jvmm_profiler_execute | Нить | Выполнить команду Profiler, см. Async-Profiler |
| Jvmm_profiler_start | См. ProfilersAmpledto, где действительнее только в поле eventcounterinteval | Выполнить команду профилировщика начала отбора проб |
| Jvmm_profiler_stop | Строка, поле формата в ProfilersAmpledto, необязательное значение - htmltxtjfr | Выполнить профилировщик, чтобы закончить команду отбора проб и экспорта |
| Jvmm_profiler_status | / | Получите текущий статус профилировщика |
| Jvmm_profiler_list_events | / | Получить мероприятия Profiler, поддерживаемые текущей средой |
| Jvmm_server_shutdown | Нить | Закройте сервис, данные - это тип службы |

HTTP Service предоставляет следующие интерфейсы API:
| Ури | метод | параметр | Тело | описывать |
|---|---|---|---|---|
| /collect/process | ПОЛУЧАТЬ | / | / | Собирать информацию о процессе |
| /collect/disk | ПОЛУЧАТЬ | / | / | Соберите данные диска физического машины |
| /collect/disk_io | ПОЛУЧАТЬ | / | / | Соберите диск ввода и пропускной способности физической машины |
| /collect/cpu | ПОЛУЧАТЬ | / | / | Соберите данные загрузки процессора физической машины |
| /collect/network | ПОЛУЧАТЬ | / | / | Соберите информацию о сетевой карте физической машины и данные IO |
| /collect/sys | ПОЛУЧАТЬ | / | / | Соберите информацию об операционной системе |
| /collect/sys/memory | ПОЛУЧАТЬ | / | / | Собрать данные памяти операционной системы |
| /collect/sys/file | ПОЛУЧАТЬ | / | / | Соберите данные об использовании разделения операционной системы |
| /collect/port | ПОЛУЧАТЬ | порты (int []) | / | Приобретение оккупации порта операционной системы |
| /collect/jvm/classloading | ПОЛУЧАТЬ | / | / | Соберите информацию о загрузке класса JVM |
| /collect/jvm/classloader | ПОЛУЧАТЬ | / | / | Соберите информацию о загрузке класса JVM |
| /collect/jvm/компиляция | ПОЛУЧАТЬ | / | / | Соберите информацию о компиляции JVM |
| /collect/jvm/gc | ПОЛУЧАТЬ | / | / | Соберите информацию о коллекционере мусора JVM |
| /collect/jvm/memory_manager | ПОЛУЧАТЬ | / | / | Собрать информацию о менеджере памяти JVM |
| /collect/jvm/memory_pool | ПОЛУЧАТЬ | / | / | Соберите информацию о пуле памяти JVM |
| /collect/jvm/память | ПОЛУЧАТЬ | / | / | Соберите использование памяти JVM |
| /collect/jvm/поток | ПОЛУЧАТЬ | / | / | Соберите статистику потока JVM |
| /collect/jvm/thread_stack | ПОЧТА | / | Смотрите Threadinfodto | Соберите указанные данные стека потоков JVM |
| /collect/jvm/dilmble_thread | ПОЛУЧАТЬ | / | / | Сбросить все данные стека потоков |
| /collect/jvm/thread_ordered_cpu_time | ПОЛУЧАТЬ | Тип (String, Stack | info), Durationseconds (int) | / | Приобретение использования процессора в потоках JVM в течение определенного времени |
| /collect/jvm/thread_detail | ПОЛУЧАТЬ | id (long []) | / | Соберите данные потока JVM (время процессора, время блока, замки и т. Д.) |
| /collect/jvm/thread_pool | ПОЛУЧАТЬ | ClassLoaderHash (String), Clazz (String), EncementField (String), Field (String) | / | Соберите информацию о пуле потоков JVM |
| /collect/by_options | ПОЛУЧАТЬ | Опции (CollectionType []) | Сбор данных в партиях на основе параметров | |
| /execute/gc | ПОЛУЧАТЬ | / | / | Выполнить GC |
| /execute/jps | ПОЛУЧАТЬ | / | / | Перечислите все процессы Java |
| /execute/jvm_tool | ПОЧТА | / | Команда (строка) | Выполнить команду инструмента JVM |
| /execute/jad | ПОЛУЧАТЬ | ClassName (String), Methodname (String) | / | Декомпиляция кода (поддерживаются только агенты) |
| /execute/load_patch | ПОЧТА | / | Jsonarray, элемент которого является PatchDto | Горячие обновления кода. При указании хэша загрузчика класса, это только горячие обновления для изменения класса, загруженного ClassLoader. |
| /execute/get_switches | ПОЛУЧАТЬ | / | / | Получите информацию о выключении приобретения |
| /execute/set_switches | ПОЛУЧАТЬ | имена (Switches []), Open (Boolean) | / | Установите переключатель приобретения |
| /profiler/flame_graph | ПОЧТА | / | Смотрите ProfilersAmpledto | Генерировать карту пламени |
| /Profiler/Start | ПОЧТА | / | См. ProfilersAmpledto, где действительнее только в поле eventcounterinteval | Выполнить команду профилировщика начала отбора проб |
| /профилировщик/остановка | ПОЧТА | / | Строка, поле формата в ProfilersAmpledto, необязательное значение - htmltxtjfr | Выполнить профилировщик, чтобы закончить команду отбора проб и экспорта |
| /Профилировщик/Статус | ПОЛУЧАТЬ | / | / | Получите текущий статус профилировщика |
| /profiler/list_events | ПОЛУЧАТЬ | / | / | Получить мероприятия Profiler, поддерживаемые текущей средой |
| /Profiler/execute | ПОЧТА | / | Команда (строка) | Выполнить команду Profiler, см. Async-Profiler |
| /Сервер/Выключение | ПОЛУЧАТЬ | цель (строка) | / | Закройте сервис, данные - это тип службы |

Операционная логика режима Sentinel заключается в регулярном сборе указанных элементов данных, а затем подталкивает их к подписчикам . Вам необходимо предоставить службу подписки (интерфейс HTTP), которая может получать данные. Если доступ к интерфейсу требует аутентификации идентификации, в настоящее время интерфейс HTTP подписчика поддерживает только базовую аутентификацию.
Конфигурация режима Sentinel
server :
type : sentinel
sentinel :
- subscribers :
# publish jvmm data to custom http server
- type : http
url : http://127.0.0.1:9999/monitor/subscriber
auth :
enable : true
username : 123456
password : 123456
# publish jvmm data to prometheus
- type : prometheus
url : http://127.0.0.1:9090/api/v1/write
auth :
enable : true
username : 123456
password : 123456
interval : 15
tasks :
- process
- disk
- disk_io
- cpu
- port
...В общей сложности поддерживаются следующие предметы сбора:
[
" process " ,
" disk " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" port " ,
" jvm_classloading " ,
" jvm_classloader " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_manager " ,
" jvm_memory_pool " ,
" jvm_thread " ,
" jvm_thread_stack " ,
" jvm_thread_detail " ,
" jvmm_thread_pool "
]В настоящее время только следующие элементы коллекции поддерживают Prometheus
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]JVMM предоставляет два панели панели шаблона Grafana, а именно: Node и JVM
Шаблон узла представляет собой набор системных элементов мониторинга, которые могут помочь вам больше сосредоточиться на мониторинге данных физических машин или облачных хостов.


Метод импорта: Import Dashboard ID 20430 или импорт Dashboard Node.json
Чтобы сотрудничать с этим шаблоном, необходимо настроить следующие задачи:
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file "
]Шаблон JVM -это набор элементов мониторинга, связанных с JVM, которые могут помочь вам сосредоточиться на данных мониторинга процесса.


Метод импорта: Import Dashboard ID 20429 или импорт DANSBOARD-JVM.JSON
Чтобы сотрудничать с этим шаблоном, необходимо настроить следующие задачи:
[
" process " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]Если вы хотите разработать вторичную на основе JVMM, вам нужно только ввести основные зависимости
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-core</ artifactId >
< version >${jvmm-version}</ version >
</ dependency > Все функциональные интерфейсы сбора данных, предоставленные предыдущим сервером и другими функциональными интерфейсами, которые не предоставляют интерфейсы удаленного вызова, могут быть получены с помощью заводского класса: org.beifengtz.jvmm.core.JvmmFactory
public class Jvmm {
public static void main ( String [] args ) {
// 提供所有的数据采集接口
JvmmCollector collector = JvmmFactory . getCollector ();
// 提供所有的执行接口
JvmmExecutor executor = JvmmFactory . getExecutor ();
// 提供火焰图生成器
JvmmProfiler profiler = JvmmFactory . getProfiler ();
}
}Клиентский инструмент JVMM предоставляет простой и быстрый способ удаленно вызовать JVMM. Конечно, он также выполняет важные функции, такие как прикрепление сервера и создание банок зависимости.
Клиентский инструмент предоставляет функцию выполнения команды Bootstrap, и он будет выполнять запрос, даже если вы не принимаете никаких параметров. Для конкретного использования, пожалуйста, используйте следующую команду, чтобы просмотреть документ справки:
java -jar jvmm.jar -hПример сбора данных клиентским инструментом
Генерировать пример диаграммы пламени

Пример вызова кода
Пример приложения на заказ

Некоторые компоненты внутри проекта могут быть использованы без проекта, легкого и простых в использовании
Причина в том, что в вашей среде нет инструментов JDK, или переменные среды не настроены. Пожалуйста, убедитесь, что ваша среда установлена с JDK вместо JRE. Простая проверка: выполните jps -l в вашей среде, и если она может быть выполнена нормально и выводит результат, это означает, что среда в порядке.
Решение: Настройте локальный каталог JDK bin в качестве переменной среды
Если вы начнете jvmm-server.jar, причина в том, что вы используете JDK 9 и выше, Java запрещает рефлексивный доступ к некоторым классам, начиная с JDK 9+.
java.lang.reflect.InaccessibleObjectException: Unable to make field final jdk.internal.loader.URLClassPath jdk.internal.loader.ClassLoaders$AppClassLoader.ucp accessible: module java.base does not "opens jdk.internal.loader" to unnamed module @2d127a61
Решение: добавьте следующие параметры виртуальной машины
# JDK 9+ 为确保成功运行建议设置以下几个虚拟机参数
# --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
# --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
# --add-opens java.base/java.net=ALL-UNNAMED
# --add-opens java.management/sun.management=ALL-UNNAMED
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jar ./jvmm.yml Если вы No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1' , причина в том, что ядро системы запрещает обнаружение производительности системы по умолчанию, и вам необходимо включить эту опцию.
sudo systcl -w kernel.perf_event_paranoid=1Или изменить файл sysctl
sudo sh -c ' echo "kernel.perf_event_paranoid=1" >> /etc/sysctl.conf '
sudo sysctl -pЭтот инструмент полностью открыт и бесплатный, и его нелегко создать. Если вы думаете, что это хорошо, вы можете пожертвовать, чтобы поддержать этот проект.
Список пожертвований:
Если вы столкнетесь с какими -либо проблемами во время использования или у вас есть уникальные идеи или предложения по этому проекту, отправьте проблему или отправьте мне личное сообщение
Электронная почта: [email protected]
WeChat: Beifeng-TZ (обратите внимание на JVMM, если вы добавите его)