
JVMM(JVM Monitor)は、Java仮想マシンとオペレーティングシステムのサービスベースの監視を提供するツールです。 OS(メモリ、CPU、ディスクステータス、IO、ネットワークカードステータス、IOなど)、JVM(メモリ、スレッド、スレッドプール、メモリプール、GC、クラスローダーなど)、豊富なデータ収集機能を備えており、火炎図の生成、ホットアップデートのホットアップデート、javaコード、妥当性などのパフォーマンスなどのパフォーマンスなどの機能などの機能を提供します。テストなど
リリースにアクセスして、JVMMの最新バージョンをダウンロードして解凍してください
ヒント:JVMMの一部の機能は、ローカル環境のJDKに依存します。環境にJREだけでなくJDKをインストールするようにしてください。簡単な検証:環境で
jps -lを実行します。正常に実行して結果を出力できる場合、環境が問題ないことを意味します。そうしないと、JVMMが実行できない場合があります。
まず、次のコマンドを実行してサービスJARパッケージを生成します
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.jarJVMMサーバーが正常に開始された場合、デフォルトでポート5010で実行され、次のように現在のディレクトリに新しいウィンドウを設定する必要があります。
java -jar jvmm.jar -m client -a 127.0.0.1:5010サーバー接続が成功した場合、クライアントモードに入ります。次のコマンドを入力して、プロセスデータを収集できます。もちろん、このモードで実行可能なすべての命令の使用を表示するためにhelpを入力できます。
info -t processJVMMクライアントモードで収集されたデータの例を次に示します。 JVMMによって提供される機能は、それ以上のものです。その他の機能については、JVMM使用文書をお読みください。
JVMMのコアデータ収集機能はcoreモジュールにあり、サービス指向の関数はserverモジュールにあります。使用法のシナリオによると、次の2つの使用方法を選択できます。
coreモジュールに基づく二次開発(その他の機能) まず、サーバーができることを理解する必要がありますか?サーバーは3つのサービスモードを提供します。使用する前に、選択する必要があるものがより適しています。 3つのサービスモードは次のとおりです。
任意のサービスモードは、構成ファイルjvmm.ymlから分離できません。 server.type 、選択したモードまたは選択するモードを構成するために使用されます。彼らは同時に走ることができます。各モードの特定の構成は、 server.jvmm 、 server.http 、およびserver.sentinelに対応しています。
server :
type : jvmm,http,sentinel # 支持同时开启多种模式
jvmm :
# ...
http :
# ...
sentinel :
# ...デフォルトの構成については、jvmm.ymlを参照し、構成情報については、構成ファイルのコメントを参照してください。
JVMMは、サーバーを起動する4つの方法を提供します。
-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 >コードの1行でサーバーを起動します
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オブジェクトに渡すことができます。カスタム構成は、構成を構築することで実装できます。
JVMMConnectorを使用してJVMM Server serverconveydemo.javaを接続します
サーバーがjvmmまたはhttpモードで開始されると、組み込みインターフェイスをリモートで呼び出すことができます。

JVMMサービスは、次の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 | / | 物理マシンのディスクIOとスループットデータを収集します |
| JVMM_COLLECT_CPU_INFO | / | 物理マシンのCPUロードデータを収集します |
| 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、その要素はスレッドIDです | JVMスレッドの詳細を収集します(CPU時間、ブロック時間、ロックなど) |
| jvmm_collect_jvm_thread_pool | JSonObject、そのプロパティは次のとおりです。ClassLoaderHash(String)、Clazz(String)、InstanceField(String)、Field(String) | JVMスレッドプール情報を収集します |
| JVMM_COLLECT_JVM_THREAD_ORDERED_CPU_TIME | jsonobject、そのプロパティは次のとおりです。タイプ(string、stack | info)、durationseconds(int) | 特定の時間内にJVMスレッドでのCPU使用の取得 |
| 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、そのプロパティは次のとおりです。クラス名(string)、methodname(string) | コード逆コンパイル(エージェントのみがサポートされています) |
| jvmm_execute_load_patch | Jsonarray、その要素はpatchdtoです | ホットアップデートをコードします。クラスローダーのハッシュを指定する場合、クラスローダーによってロードされたクラスを変更するためのホットアップデートのみです。 |
| jvmm_execute_switches_get | / | 取得スイッチ情報を取得します |
| jvmm_execute_switches_set | jsonobject、そのプロパティは次のとおりです。名前(switches [])、open(boolean) | 取得スイッチを設定します |
| jvmm_profiler_sample | profilersampledtoを参照してください | フレームマップを生成します |
| jvmm_profiler_execute | 弦 | プロファイラーコマンドを実行するには、Async-Profilerを参照してください |
| jvmm_profiler_start | eventcounterintevalフィールドのみが有効なProfilerSampledtoを参照してください | プロファイラー開始サンプリングコマンドを実行します |
| jvmm_profiler_stop | 文字列、プロファイルサンプリングのフォーマットフィールド、オプションの値はhtmltxtjfrです | プロファイラーを実行してサンプリングとエクスポートファイルコマンドを終了します |
| jvmm_profiler_status | / | 現在のプロファイラーステータスを取得します |
| jvmm_profiler_list_events | / | 現在の環境でサポートされているプロファイラーイベントを入手してください |
| jvmm_server_shutdown | 弦 | サービスを閉じると、データはサービスタイプです |

HTTPサービスは、次のAPIインターフェイスを提供します。
| uri | 方法 | パラメーター | 体 | 説明する |
|---|---|---|---|---|
| /収集/プロセス | 得る | / | / | プロセス情報を収集します |
| /コレクション/ディスク | 得る | / | / | 物理マシンディスクデータを収集します |
| /collect/disk_io | 得る | / | / | 物理マシンのディスクIOとスループットデータを収集します |
| /collect/cpu | 得る | / | / | 物理マシンのCPUロードデータを収集します |
| /collect/network | 得る | / | / | 物理マシンネットワークカード情報とIOデータを収集します |
| /収集/sys | 得る | / | / | オペレーティングシステム情報を収集します |
| /収集/sys/メモリ | 得る | / | / | オペレーティングシステムのメモリデータを収集します |
| /収集/sys/ファイル | 得る | / | / | オペレーティングシステムディスクパーティションの使用データを収集します |
| /収集/ポート | 得る | ポート(int []) | / | オペレーティングシステムポート職業の買収 |
| /collect/jvm/classloading | 得る | / | / | JVMクラスの読み込み情報を収集します |
| /collect/jvm/classloader | 得る | / | / | JVMクラスローダー情報を収集します |
| /collect/jvm/compilation | 得る | / | / | 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/dump_thread | 得る | / | / | すべてのスレッドスタックデータをダンプします |
| /collect/jvm/thread_ordered_cpu_time | 得る | タイプ(文字列、スタック|情報)、期間econds(int) | / | 特定の時間内にJVMスレッドでのCPU使用の取得 |
| /collect/jvm/thread_detail | 得る | id(long []) | / | JVMスレッドの詳細を収集します(CPU時間、ブロック時間、ロックなど) |
| /collect/jvm/thread_pool | 得る | classloaderhash(string)、clazz(string)、instancefield(string)、field(string) | / | JVMスレッドプール情報を収集します |
| /collect/by_options | 得る | オプション(collectionType []) | オプションに基づくバッチ内のデータ収集 | |
| /実行/gc | 得る | / | / | GCを実行します |
| /実行/jps | 得る | / | / | すべてのJavaプロセスをリストします |
| /execute/jvm_tool | 役職 | / | コマンド(文字列) | JVMツールコマンドを実行します |
| /実行/jad | 得る | classname(string)、methodname(string) | / | コード逆コンパイル(エージェントのみがサポートされています) |
| /execute/load_patch | 役職 | / | Jsonarray、その要素はpatchdtoです | ホットアップデートをコードします。クラスローダーのハッシュを指定する場合、クラスローダーによってロードされたクラスを変更するためのホットアップデートのみです。 |
| /execute/get_switches | 得る | / | / | 取得スイッチ情報を取得します |
| /execute/set_switches | 得る | 名前(switches [])、open(boolean) | / | 取得スイッチを設定します |
| /プロファイラー/flame_graph | 役職 | / | profilersampledtoを参照してください | フレームマップを生成します |
| /PROPILER/START | 役職 | / | eventcounterintevalフィールドのみが有効なProfilerSampledtoを参照してください | プロファイラー開始サンプリングコマンドを実行します |
| /プロファイラー/停止 | 役職 | / | 文字列、プロファイルサンプリングのフォーマットフィールド、オプションの値はhtmltxtjfrです | プロファイラーを実行してサンプリングとエクスポートファイルコマンドを終了します |
| /プロファイラー/ステータス | 得る | / | / | 現在のプロファイラーステータスを取得します |
| /profiler/list_events | 得る | / | / | 現在の環境でサポートされているプロファイラーイベントを入手してください |
| /プロファイラー/実行 | 役職 | / | コマンド(文字列) | プロファイラーコマンドを実行するには、Async-Profilerを参照してください |
| /サーバー/シャットダウン | 得る | ターゲット(文字列) | / | サービスを閉じると、データはサービスタイプです |

Sentinelモードの動作ロジックは、指定されたデータ項目を定期的に収集し、サブスクライバーにプッシュすることです。データを受信できるサブスクリプションサービス(HTTPインターフェイス)を提供する必要があります。インターフェイスアクセスにID認証が必要な場合、サブスクライバー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 "
]現在、次のコレクションアイテムのみがプロメテウスをサポートしています
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]JVMMは2つのGrafanaテンプレートダッシュボードを提供します。つまり、ノードとJVM
ノードテンプレートは、システム関連の監視項目のコレクションであり、物理マシンまたはクラウドホストの監視データにもっと集中するのに役立ちます。


インポート方法:ダッシュボードID 20430をインポートするか、DashBoard-Node.jsonをインポートします
このテンプレートに協力するには、次のタスクを構成する必要があります。
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file "
]JVMテンプレートは、JVM関連の監視項目のコレクションであり、プロセスの監視データにもっと集中するのに役立ちます。


インポート方法:ダッシュボードID 20429をインポートするか、DashBoard-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ツールや環境変数が構成されていないためです。 JREだけでなく、JDKを使用して環境がインストールされていることを確認してください。簡単な検証: 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.ymlNo 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このツールは完全にオープンソースで無料であり、作成するのは簡単ではありません。良いと思われる場合は、このプロジェクトをサポートするために寄付できます。
寄付リスト:
使用中に問題が発生した場合、またはこのプロジェクトに関するユニークな洞察や提案がある場合は、問題を送信するか、プライベートメッセージを送信してください
wechat:beifeng-tz(追加する場合はJVMMに注意してください)