jcmd:JDK 14のデバッグ神器
概要
jcmdはJDK独自のデバッグツールで、非常に強力な機能を備えています.jcmdはJDK 7に正式に導入され、jcmdがあれば、jstakやjmapなど、多くの一般的な他のツールを完全に置き換えることができます.
jcmdは、特定の診断コマンドをJVMに送信することができる.安全のため、jcmdを使用するユーザーは、実行するjavaプログラムと同じユーザーとユーザーグループを持つ必要があります.
jcmdのデバッグコマンドには多くの種類があり、それぞれのデバッグコマンドには独自のパラメータがあります.
本稿では,jcmdの使用について具体的な例と結びつけて詳細に説明する.
jcmdの構文
jcmdの構文は簡単です.
pidとmain-classは2つの選択肢です.
ここでpidは、診断コマンドを送信するjavaプロセスidを表す.
main-classを指定して、main-classを実行するjavaプロセスに診断コマンドを送信することもできます.
commandは、jcmdで実行できるコマンドを示します.jcmdがサポートするコマンドを見てみましょう.
Perfcounter.printはjavaプロセスが露出したperformance countersを印刷することを示します.
-f filenameは、実行するコマンドをテキストファイルから読み出すことを示します.
-lはdockerで実行されていないJVMをリストします.
-hはヘルプを表します.
次によく使われる例をいくつか挙げます
実行中のJVMのリスト
jcmd-lを使用すると、実行中のすべてのJVMプロセスをリストできます.jpsと同じです.
stack情報の印刷
jcmd pid Thread.print-lを使用してjavaプログラムのstack情報を印刷できます.ここで、-lはjava.util.concurrentを出力するlock情報を表す.
簡単な例を見てみましょう.
印刷heap info
jcmd pid GC.heap_を使用infoはheap infoを得ることができる.
印刷
heapの中に何があるのか知りたいなら、次のコマンドでheap dumpを出すことができます.
heap dumpはファイル名を入力し、dumpからの情報を格納する必要があります.
統計heap使用状況
heapの各オブジェクトの使用状況を統計する必要がある場合は、次の方法があります.
上記の結果は非常に有用であり、いくつかのパフォーマンスデバッグ方法では予想外の役割を果たすことができます.
JFR機能
jcmdはjfr機能もサポートしています.JFRのフルネームはJava Flight Recorderです.JVM内のいくつかのイベントのレコーダと見なすことができます.
JFRの詳細については、次の記事で詳しく説明します.
まとめ
jcmdには他にも多くの機能があり、多くの探索を行うことができます.
本文の作者:flydeanプログラムのあれらの事
このリンク:http://www.flydean.com/jdk14-jcmd/
出典:flydeanのブログ
私の公衆番号に注目することを歓迎します:プログラムのあれらの事、もっとすばらしいのはあなたを待っています!
jcmdはJDK独自のデバッグツールで、非常に強力な機能を備えています.jcmdはJDK 7に正式に導入され、jcmdがあれば、jstakやjmapなど、多くの一般的な他のツールを完全に置き換えることができます.
jcmdは、特定の診断コマンドをJVMに送信することができる.安全のため、jcmdを使用するユーザーは、実行するjavaプログラムと同じユーザーとユーザーグループを持つ必要があります.
jcmdのデバッグコマンドには多くの種類があり、それぞれのデバッグコマンドには独自のパラメータがあります.
本稿では,jcmdの使用について具体的な例と結びつけて詳細に説明する.
jcmdの構文
jcmdの構文は簡単です.
jcmd [pid | main-class] command... | PerfCounter.print | -f filename
jcmd [-l]
jcmd -h
pidとmain-classは2つの選択肢です.
ここでpidは、診断コマンドを送信するjavaプロセスidを表す.
main-classを指定して、main-classを実行するjavaプロセスに診断コマンドを送信することもできます.
commandは、jcmdで実行できるコマンドを示します.jcmdがサポートするコマンドを見てみましょう.
./jcmd 93989 help
93989:
The following commands are available:
Compiler.CodeHeap_Analytics
Compiler.codecache
Compiler.codelist
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
Compiler.queue
GC.class_histogram
GC.class_stats
GC.finalizer_info
GC.heap_dump
GC.heap_info
GC.run
GC.run_finalization
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
JVMTI.agent_load
JVMTI.data_dump
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
Thread.print
VM.class_hierarchy
VM.classloader_stats
VM.classloaders
VM.command_line
VM.dynlibs
VM.events
VM.flags
VM.info
VM.log
VM.metaspace
VM.native_memory
VM.print_touched_methods
VM.set_flag
VM.stringtable
VM.symboltable
VM.system_properties
VM.systemdictionary
VM.uptime
VM.version
help
Perfcounter.printはjavaプロセスが露出したperformance countersを印刷することを示します.
-f filenameは、実行するコマンドをテキストファイルから読み出すことを示します.
-lはdockerで実行されていないJVMをリストします.
-hはヘルプを表します.
次によく使われる例をいくつか挙げます
実行中のJVMのリスト
./jcmd -l
98109 jdk.jcmd/sun.tools.jcmd.JCmd -l
jcmd-lを使用すると、実行中のすべてのJVMプロセスをリストできます.jpsと同じです.
stack情報の印刷
jcmd pid Thread.print-lを使用してjavaプログラムのstack情報を印刷できます.ここで、-lはjava.util.concurrentを出力するlock情報を表す.
簡単な例を見てみましょう.
./jcmd 93989 Thread.print -l
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):
Threads class SMR info:
_java_thread_list=0x00007fbeb1c4cb10, length=12, elements={
0x00007fbeb282a800, 0x00007fbeb282d800, 0x00007fbeb282e800, 0x00007fbeb2830800,
0x00007fbeb2831800, 0x00007fbeb2832000, 0x00007fbeb2833000, 0x00007fbeb3831000,
0x00007fbeb3822000, 0x00007fbeb3174000, 0x00007fbeb3815000, 0x00007fbeb226f800
}
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.64ms elapsed=8996.59s tid=0x00007fbeb282a800 nid=0x4703 waiting on condition [0x000070000440d000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method)
at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:213)
Locked ownable synchronizers:
- None
印刷heap info
jcmd pid GC.heap_を使用infoはheap infoを得ることができる.
./jcmd 93989 GC.heap_info
93989:
garbage-first heap total 71680K, used 34410K [0x00000007d4400000, 0x0000000800000000)
region size 1024K, 20 young (20480K), 4 survivors (4096K)
Metaspace used 23810K, capacity 24246K, committed 24752K, reserved 1071104K
class space used 2850K, capacity 3015K, committed 3072K, reserved 1048576K
印刷
heapの中に何があるのか知りたいなら、次のコマンドでheap dumpを出すことができます.
./jcmd 93989 GC.heap_dump heap_dump.out
93989:
Dumping heap to heap_dump.out ...
Heap dump file created [27727979 bytes in 0.643 secs]
heap dumpはファイル名を入力し、dumpからの情報を格納する必要があります.
統計heap使用状況
heapの各オブジェクトの使用状況を統計する必要がある場合は、次の方法があります.
./jcmd 93989 GC.class_histogram
93989:
num #instances #bytes class name (module)
-------------------------------------------------------
1: 25826 11748304 [B ([email protected])
2: 2233 1971800 [I ([email protected])
3: 5154 614928 java.lang.Class ([email protected])
4: 24757 594168 java.lang.String ([email protected])
5: 4491 439432 [Ljava.lang.Object; ([email protected])
6: 13177 421664 java.util.concurrent.ConcurrentHashMap$Node ([email protected])
7: 5025 160800 java.util.HashMap$Node ([email protected])
8: 8793 140688 java.lang.Object ([email protected])
9: 212 103584 [Ljava.util.concurrent.ConcurrentHashMap$Node; ([email protected])
上記の結果は非常に有用であり、いくつかのパフォーマンスデバッグ方法では予想外の役割を果たすことができます.
JFR機能
jcmdはjfr機能もサポートしています.JFRのフルネームはJava Flight Recorderです.JVM内のいくつかのイベントのレコーダと見なすことができます.
JFRの詳細については、次の記事で詳しく説明します.
まとめ
jcmdには他にも多くの機能があり、多くの探索を行うことができます.
本文の作者:flydeanプログラムのあれらの事
このリンク:http://www.flydean.com/jdk14-jcmd/
出典:flydeanのブログ
私の公衆番号に注目することを歓迎します:プログラムのあれらの事、もっとすばらしいのはあなたを待っています!