Java-JDK監視およびトラブルシューティングツールの高レベルのコア知識の包括的な分析(JDKコマンドラインツールの詳細な説明!、JDK視覚分析ツールの使用法!)

1.JDKコマンドラインツール

これらのコマンドは、JDKインストールディレクトリの下のbinディレクトリにあります。

  • jps(JVMプロセスステータス):UNIXのようなpsコマンド。ユーザーは、すべてのJavaプロセスの起動クラス、着信パラメーター、およびJava仮想マシンパラメーターを表示します。
  • jstat (JVM統計監視ツール):HotSpot仮想マシンの実行データのすべての側面を収集するために使用されます。
  • jinfo (Javaの構成情報):Javaの構成情報。仮想マシンの構成情報を表示します。
  • jmap (Javaのメモリマップ):ヒープダンプスナップショットを生成します。
  • jhat (JVMヒープダンプブラウザ):ヒープダンプファイルの分析に使用され、HTTP / HTMLサーバーを確立して、ユーザーがブラウザで分析結果を表示できるようにします。
  • jstack (Javaのスタックトレース):仮想マシンの現在の瞬間にスレッドスナップショットを生成します。スレッドスナップショットは、現在の仮想マシンの各スレッドによって実行されているメソッドスタックのコレクションです。

1.jps:すべてのJavaプロセスを表示

jps(JVMプロセスステータス)コマンドUNIXのようなpsコマンド。

jps:仮想マシン実行のメインクラスの名前と、これらのプロセスの一意のID(ローカル仮想マシン識別子、LVMID)を表示します。jps -q:プロセスのローカル仮想マシンの一意のIDのみを出力します。

C:\Users\SnailClimb>jps 
7360 NettyClient2 
17396 
7972 Launcher 
16504 Jps 
17340 NettyServer

jps -l :メインクラスのフルネームを出力します。プロセスがJarパッケージを実行している場合は、Jarパスを出力します。

C:\Users\SnailClimb>jps -l 
7360 firstNettyDemo.NettyClient2 
17396 
7972 org.jetbrains.jps.cmdline.Launcher 
16492 sun.tools.jps.Jps 
17340 firstNettyDemo.NettyServer

jps -v :仮想マシンプロセスの開始時にJVMパラメータを出力します。

jps -m :Javaプロセスのmain()関数に渡されたパラメーターを出力します。

2.jstat:仮想マシンのさまざまな動作ステータス情報を監視します

jstat(JVM統計監視ツール)仮想マシンのさまざまな動作ステータス情報を監視するために使用されるコマンドラインツール。仮想マシンプロセスのクラス情報、メモリ、ガベージコレクション、JITコンパイル、およびその他の実行データをローカルまたはリモートで表示できます(リモートホストからのRMIサポートが必要です)。GUIがなく、プレーンテキストコンソール環境のみを提供するサーバーでは、これは、操作中に仮想マシンのパフォーマンスの問題を特定するための最適なツールになります。

jstat コマンド形式:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

たとえば、jstat -gc -h3 31736 1000 10ID 31736 gcの場合の分析プロセスを示します。レコードは、1000msごとに1回、印刷を停止するために10回印刷され、3行ごとにインジケータヘッドが印刷されます。

一般的なオプションは次のとおりです。

  • jstat -class vmid:ClassLoaderの関連情報を表示します。
  • jstat -compiler vmid:JITコンパイルに関する関連情報を表示します。
  • jstat -gc vmid:GCに関連するヒープ情報を表示します。
  • jstat -gccapacity vmid:各世代の容量と使用量を表示します。
  • jstat -gcnew vmid:新世代の情報を表示します。
  • jstat -gcnewcapcacity vmid:新世代のサイズと使用法を表示します。
  • jstat -gcold vmid:旧世代と永続世代の動作統計を表示します。jdk1.8以降、永続世代が削除されたため、このオプションは旧世代のみを示します。
  • jstat -gcoldcapacity vmid:老齢のサイズを表示します。
  • jstat -gcpermcapacity vmid:永続世代のサイズを表示します。jdk1.8以降、永続世代が削除されたため、このオプションは存在しなくなりました。
  • jstat -gcutil vmid:ガベージコレクション情報を表示します。

さらに、-tリストされたパラメータをタイムスタンプに追加すると、プログラムの実行時間を表示するための情報が出力されます。

3.jinfo:仮想マシンのパラメーターをリアルタイムで表示および調整します

jinfo vmid :現在のJVMプロセスのすべてのパラメーターとシステム属性を出力します(最初の部分はシステム属性で、2番目の部分はJVMパラメーターです)。

jinfo -flag name vmid:名前に対応するパラメータの特定の値を出力します。たとえば、MaxHeapSizeを出力し、現在のjvmプロセスでGCログの印刷が有効になっているかどうかを確認します(-XX:PrintGCDetails:詳細なGCログモード。どちらもデフォルトで無効になっています)。

C:\Users\SnailClimb>jinfo -flag MaxHeapSize 17340 
-XX:MaxHeapSize=2124414976 
C:\Users\SnailClimb>jinfo -flag PrintGC 17340 
-XX:-PrintGC

jinfoを使用すると、仮想マシンを再起動せずにjvmのパラメーターを動的に変更できます。特にオンライン環境は特に便利です。次の例を参照してください。

jinfo -flag [+|-]name vmid対応する名前のパラメーターをオンまたはオフにします。

C:\Users\SnailClimb>jinfo -flag PrintGC 17340 
-XX:-PrintGC 

C:\Users\SnailClimb>jinfo -flag +PrintGC 17340 

C:\Users\SnailClimb>jinfo -flag PrintGC 17340 
-XX:+PrintGC

4.jmap:ヒープダンプスナップショットを生成します

jmap(Memory Map for Java)コマンドは、ヒープダンプスナップショットを生成するために使用されます。jmapコマンドを使用しない場合は、 " -XX:+HeapDumpOnOutOfMemoryError"パラメーターを使用してJavaヒープダンプを取得できます。これにより、仮想マシンはOOM例外が発生した後にダンプファイルを自動的に生成できます。Linuxコマンドではkill -3、プロセス終了信号を送信してダンプファイルを取得することもできます。

jmapの役割は、ダンプファイルを取得することだけでなく、ファイナライザー実行キュー、Javaヒープ、および現在使用されているコレクターなどのスペース使用量などの永続的な生成の詳細を照会することもできます。またjinfojmapWindowsプラットフォームには多くの機能があるため、制限もあります。

例:指定したアプリケーションのヒープスナップショットをデスクトップに出力します。後で、jhatやVisualVMなどのツールを使用してファイルの山を分析できます。

C:\Users\SnailClimb>jmap - 
dump:format=b,file=C:\Users\SnailClimb\Desktop\heap.hprof 17340 
Dumping heap to C:\Users\SnailClimb\Desktop\heap.hprof ... 
Heap dump file created

5. jhat:ヒープダンプファイルを分析します

jhat ヒープダンプファイルの分析に使用され、HTTP / HTMLサーバーを確立して、ユーザーが分析結果をブラウザーで表示できるようにします。

C:\Users\SnailClimb>jhat C:\Users\SnailClimb\Desktop\heap.hprof 
Reading from C:\Users\SnailClimb\Desktop\heap.hprof... 
Dump file created Sat May 04 12:30:31 CST 2019 
Snapshot read, resolving... 
Resolving 131419 objects... 
Chasing references, expect 26 dots.......................... 
Eliminating duplicate references.......................... 
Snapshot resolved. 
Started HTTP server on port 7000
 Server is ready.

http:// localhost:7000 /にアクセスします

6.jstack:現時点で仮想マシンのスレッドスナップショットを生成します

jstack(Stack Trace for Java)コマンドは、現時点で仮想マシンのスレッドスナップショットを生成するために使用されます。スレッドスナップショットは、現在の仮想マシンの各スレッドによって実行されているメソッドスタックのコレクションです。

スレッドスナップショットを生成する目的は、主に、スレッド間のデッドロック、無限ループ、外部リソースの要求によって引き起こされる長い待機など、スレッドの長い一時停止の原因を特定することです。これらはすべて、スレッドの長い一時停止の原因です。スレッドが一時停止jstack通過して各スレッドの呼び出しスタックを表示すると、バックグラウンドで何かを実行するためにスレッドが応答しておらず、何かまたはリソースを待機していることがわかります。

以下は、スレッドデッドロックのコードです。次に、jstackコマンドを使用してデッドロックチェックを実行し、デッドロック情報を出力して、デッドロックが発生しているスレッドを見つけます。

public class DeadLockDemo {
    
     
	private static Object resource1 = new Object();//资源 1 
	private static Object resource2 = new Object();//资源 2 
	
	public static void main(String[] args) {
    
     
		new Thread(() -> {
    
     
			synchronized (resource1) {
    
     
				System.out.println(Thread.currentThread() + "get resource1"); 
				try {
    
    
					Thread.sleep(1000); 
				} catch (InterruptedException e) {
    
     
					e.printStackTrace(); 
				}
				System.out.println(Thread.currentThread() + "waiting get resource2"); 
				synchronized (resource2) {
    
     
					System.out.println(Thread.currentThread() + "get resource2"); 
				} 
			} 
		}, "线程 1").start(); 
		
		new Thread(() -> {
    
     
			synchronized (resource2) {
    
     
				System.out.println(Thread.currentThread() + "get resource2"); 
				try {
    
    
					Thread.sleep(1000);
				} catch (InterruptedException e) {
    
     
					e.printStackTrace(); 
				}
				System.out.println(Thread.currentThread() + "waiting get resource1"); 
				synchronized (resource1) {
    
     
					System.out.println(Thread.currentThread() + "get resource1"); 
				} 
			} 
		}, "线程 2").start(); 
	} 
}

出力

Thread[线程 1,5,main]get resource1 
Thread[线程 2,5,main]get resource2 
Thread[线程 1,5,main]waiting get resource2 
Thread[线程 2,5,main]waiting get resource1

スレッドAは、同期(resource1)を介してresource1のモニターロックを取得し、次に渡しThread.sleep(1000)ます。スレッドBを実行できるようにするために、スレッドAを1秒間スリープさせてから、resource2のモニターロックを取得します。スレッドAとスレッドBはどちらも、スリープが終了した後、相互にリソースを要求し始めます。その後、2つのスレッドは相互に待機状態になり、デッドロックも発生します。

することによりjstack、コマンド解析:

C:\Users\SnailClimb>jps 
13792 KotlinCompileDaemon 
7360 NettyClient2 
17396 
7972 Launcher 
8932 Launcher 
9256 DeadLockDemo 
10764 Jps 
17340 NettyServer 

C:\Users\SnailClimb>jstack 9256

出力の一部は次のとおりです。

Found one Java-level deadlock: 
============================= 
"线程 2": 
	waiting to lock monitor 0x000000000333e668 (object 0x00000000d5efe1c0, a java.lang.Object), 
	which is held by "线程 1" 
"线程 1": 
	waiting to lock monitor 0x000000000333be88 (object 0x00000000d5efe1d0, a java.lang.Object), 
	which is held by "线程 2" 

Java stack information for the threads listed above: ===================================================
"线程 2":
	at DeadLockDemo.lambda$main$1(DeadLockDemo.java:31) 
	- waiting to lock <0x00000000d5efe1c0> (a java.lang.Object) 
	- locked <0x00000000d5efe1d0> (a java.lang.Object) 
	at DeadLockDemo$$Lambda$2/1078694789.run(Unknown Source) 
	at java.lang.Thread.run(Thread.java:748) "线程 1":
	at DeadLockDemo.lambda$main$0(DeadLockDemo.java:16) 
	- waiting to lock <0x00000000d5efe1d0> (a java.lang.Object) 
	- locked <0x00000000d5efe1c0> (a java.lang.Object) 
	at DeadLockDemo$$Lambda$1/1324119927.run(Unknown Source) 
	at java.lang.Thread.run(Thread.java:748) 

Found 1 deadlock.

jstackコマンドが、デッドロックが発生したスレッドに関する特定の情報を見つけるのに役立っていることがわかります。

この学習資料を入手したい学生は、[这里](https://jq.qq.com/?_wv=1027&k=2BS0mHEE)をクリックして入手できます

2、JDK視覚分析ツール

1.JConsole:Java監視および管理コンソール

JConsoleは、JMXに基づく視覚的な監視および管理ツールです。ローカルサーバーとリモートサーバーのjavaプロセスのメモリ使用量を簡単に監視できます。コンソールconsoleコマンドで出力して開始するか、JDKディレクトリの下のbinディレクトリで検索し、jconsole.exeダブルクリックして開始できます。

Jconsole

への接続JConsoleを使用してリモートプロセスに接続する必要がある場合は、リモートJavaプログラムの起動時に次のパラメータを追加できます。

-Djava.rmi.server.hostname=外网访问 ip 地址 
-Dcom.sun.management.jmxremote.port=60001 //监控的端口号 
-Dcom.sun.management.jmxremote.authenticate=false //关闭认证 
-Dcom.sun.management.jmxremote.ssl=false

JConsoleを使用して接続する場合、リモートプロセスアドレスは次のとおりです。

インターネットアクセスIPアドレス:60001

Javaプログラムの概要を表示

メモリ監視

JConsoleは、現在のメモリに関する詳細情報を表示できます。次の図に示すように、ヒープメモリ/非ヒープメモリの全体的な情報だけでなく、エデンエリアとサバイバーエリアの使用状況も含まれます。

右側の[GC(G)の実行]ボタンをクリックして、アプリケーションにフルGCを強制的に実行させます。

  • セノゾイックGC(マイナーGC):セノゾイックで発生するガベージコレクションを指します。マイナーGCは非常に頻繁に発生し、収集速度は一般的に高速です。
  • Old GC(Major GC / Full GC):古い時代に発生したGCを指します。MajorGCには、少なくとも1つのMinor GC(絶対ではありません)が伴うことがよくあります。MajorGCの速度は、通常、MinorGCの速度の10倍以上遅くなります。 。

    スレッドの監視

同様にjstack、コマンドの前で話しますが、これは視覚化です。

下部に「デッドロックの検出(D)」ボタンがあります。このボタンをクリックすると、デッドロックのあるスレッドとその詳細情報が自動的に検索されます。

2.ビジュアルVM:オールインワントラブルシューティングツール

VisualVMは、Java仮想マシン(JVM)で実行されているJavaアプリケーションの詳細情報を提供します。VisualVMのグラフィカルユーザーインターフェイスでは、複数のJavaアプリケーションに関する関連情報を便利かつ迅速に表示できます。

次の段落は、「Java仮想マシンの詳細な理解」から抜粋したものです。

VisualVM(オールインワンJavaトラブルシューティングツール)は、これまでにJDKでリリースされた最も強力な操作監視およびトラブルシューティングプログラムです。「オールインワン」の公式説明は、VisualVMのソフトウェア説明に記載されています。この言葉は、動作の監視と障害処理に加えて、プロファイリングなどの他の多くの機能も提供することを示しています。VisualVMのパフォーマンス分析機能は、JProfilerやYourKitなどのプロフェッショナルで有料のプロファイリングツールに劣らず、VisualVMにも大きな利点があります。監視対象のプログラムを特別なエージェントに基づいて実行する必要がないため、アプリケーションにとって非常に重要です。実際のパフォーマンスへの影響は非常に小さいため、実稼働環境に直接適用できます。この利点は、JProfilerやYourKitなどのツールに匹敵するものではありません。

VisualVMはNetBeansプラットフォームに基づいて開発されているため、最初からプラグイン拡張機能の特性を備えています。プラグイン拡張のサポートにより、VisualVMは次のことができます。

  • 仮想マシンプロセスとその構成および環境情報(jps、jinfo)を表示します。
  • アプリケーションのCPU、GC、ヒープ、メソッド領域、およびスレッド情報(jstat、jstack)を監視します。
  • ヒープダンプスナップショット(jmap、jhat)をダンプして分析します。
  • メソッドレベルのプログラムパフォーマンス分析では、最も多く呼び出され、実行時間が最も長いメソッドが検出されます。
  • オフラインプログラムスナップショット:プログラムのランタイム構成、スレッドダンプ、メモリダンプ、およびその他の情報を収集してスナップショットを作成します。スナップショットは、バグフィードバックのために開発者に送信できます。
  • 他のプラグインの無限の可能性...

参考資料:「Java中級および上級コア知識の包括的分析」
この学習資料を入手したい学生は、ここをクリックして入手できます。

おすすめ

転載: blog.csdn.net/Java_Caiyo/article/details/111052637