Java仮想マシンの第二版の深い理解(4)仮想マシンのパフォーマンス監視とトラブルシューティングツール

JDKコマンドラインツール(JPS:VMプロセスステータスツール、JSTAT:Java構成ツール、jmapは:Javaのメモリイメージングツール、jhat:ツール、Jinfoの監視仮想マシンの統計仮想マシンのヒープ・ダンプ解析ツールのスナップショットを、jstack: Javaのスタックトレースツール);可視化ツール(JConsoleの、VisualVMの)

 

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

  • JPS:JVMプロセスステータスツールは、指定されたシステム内のすべてのHotSpot仮想マシンプロセスを表示します
  • JSTAT:JVM統計監視ツールは、ユーザーがデータのすべての側面を実行するためのHotSpot仮想マシンを集めます
  • Jinfoの:Java用のコンフィギュレーション情報、仮想マシンの構成情報を表示
  • Java用のメモリダンプのスナップショットメモリマップ、生成された仮想マシン:jmapの
  • jhat、JVMのヒープダンプブラウザ、ユーザー分析heapdumpファイルは、それは、ユーザーがブラウザで結果を見ることができるように、HTTP / HTMLサーバーを作成します。
  • jstack、Java用スタックトレース、仮想マシンの表示スレッドのスナップショット

1つのJPS:VMプロセス・ステータス・ツール

JSPのコマンド形式:

JPS [オプション] [ホストID]

JPS执行样例:
D:\ \ Javaの\ jdk1.6.0_21 \ binに> JPS-Lを開発
2388 D:\ \ GlassFishの\ binに\ .. \モジュール\ ADMIN-cli.jar開発
2764 com.sun.enterprise.glassfishを.bootstrap.ASMain
3788 sun.tools.jps.Jps

 

2 JSTAT:仮想マシンの統計情報のモニタリングツール

JSTATコマンドの形式は次のとおりです。

JSTAT [オプションVMID [間隔[秒| MS] [カウント]]]

パラメータ間隔とクエリー間隔を表し、あなたは一度だけクエリことを示し、両方のパラメータを省略した場合、回数をカウント。コマンドがなければならないことを、あなたは250ミリ秒ごとにガベージコレクションプロセス条件2764年、20件の問い合わせの合計を照会するとします:

2764 250 20 -gc JSTAT

 

2764 -gcutil JSTAT:例の適用JSTAT

S0とS1 P FGC FGCT YGCT YGC GCT
0.00 0.00 6.20 41.42 47.20 16 0 105 3 0472 0577

空間の6.2%を使用して(エデン表さE)新世代エデン地区このサーバは、2:クエリ結果があることを示した
、サバイバーエリア(O歳空である(S0、S1は、Survivor0、Survivor1を表します。)彼は旧)を表し、
P(の永久的な生成、永久表す)は、それぞれ47.20パーセントとスペースの41.42パーセントを使用します。プログラムの実行があったので、
マイナーGC 16回、合計時間0.105秒(YGC、ヤングGCを表す)、フルGC(FGCは、フル発現生じ
3回GC)を、フルGCは、合計(FGCT、発現フルGC時間)経過時間に0.472秒、すべてのGCの合計が(GCT、経過時間
GC時間を表す)0.577秒でした

 

3 Jinfoの:Java構成ツール

Jinfoのコマンド形式:

Jinfoの[オプション] PID

例を適用します。CMSInitiatingOccupancyFractionクエリパラメータ値。
C:\> JinfoのCMSInitiatingOccupancyFractionのフラグ-1444
-XX:CMSInitiatingOccupancyFraction = 85

 

4 jmapは:Javaのメモリイメージングツール

jmapのコマンド形式:

jmapの[オプション] VMID

使用jmapの生成ダンプ文件
C:\ Users \ユーザーIcyFenix> jmapのダンプ:フォーマット= B、ファイル=はeclipse.bin 3500
Cへのダンプのヒープ:\ Users \ユーザーIcyFenix \はeclipse.bin ......
ヒープ・ダンプ・ファイルが作成され

 

5 jhat:仮想マシンのヒープダンプ解析ツールのスナップショット

jhat分析ダンプファイルを使用します

C:\ Users \ユーザーIcyFenix> jhatはeclipse.bin 
読みからはeclipse.bin ...... 
ダンプファイルは金11月作成19  220721 CST 2010 
スナップショットは......解決、読んで
解決1225951個の......オブジェクトを
期待して、参照を追う245個のドットを...... 
重複した参照を排除...... 
スナップショットは解決しました。
ポート上で開始したHTTPサーバ7000 
Serverがある準備ができて。

ブラウザ、タイプHTTPのユーザー:// localhostを:7000 /結果を見ることができます

 

6 jstack:Javaのスタックトレースツール

jstackコマンドの形式:

jstack [オプション] VMID

 

 

二つ。JDKの可視化ツール

JConsoleのとVisualVMは:コマンドラインツールを多数提供することに加えてJDK、2つの強力な可視化ツールがあります

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

1.1 JConsoleを起動

「jconsole.exe」JDK / binディレクトリに起動することで

 

 

 

 1.2メモリーモニター

モニタコードへのJConsole

/ ** 
 *メモリプレースホルダオブジェクト、ターゲットOOMObject約64キロバイト
 * -Xms -Xmx 100メートル100メートル-XX:+ UseSerialGC 
 * / 
パブリック クラスOOMObject {
     公共の バイト [] =プレース新しい新しい バイト [64×1024 ]; 
}
パブリック クラスOOMObjectTest1 {
     公共の 静的な 無効 fillHeap(int型 NUM)がスロー例外:InterruptedException { 
        一覧 <OOMObject>リストを= 新しいのArrayList <OOMObject> ();
        以下のためにINT I 0 =; I <NUM; I ++ ){ 
            のThread.sleep( 100 )。
            list.add(新しいOOMObject()); 
        } 
        にSystem.gc(); 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数)がスロー InterruptedExceptionあるが{
        fillHeap( 1000); 
    } 
}

 

 

「メモリ」タブでプログラムを実行すると、トレンド実行エデンメモリプール領域のプレゼントに折れ線を見ることができ、かつものの、後にSystem.gc()を実行し、実行するために1000サイクルの終わりに、チャートから見ることができますエデンとサバイバー分野の全く新しい世代は、基本的にクリアされているが、ヒストグラムは、古い時代を表しているにSystem.gc()メソッドを実行した後にまだ生きているヒープデータ内に充填され、ピークの状態のまま

 

1.3監視スレッド 

スレッドの待機は、コードをデモ

パブリック クラスOOMObjectTest2 {
     / ** 
     *実証無限ループ糸
     * / 
    パブリック 静的 ボイドcreateBusyThread(){ 
        スレッドthread = 新規新しいスレッド(新しい新しいRunnableを(){
             公共 ボイドRUN(){
                 ながら真の// 行41 
                ; 
            } 
        } 、 "testBusyThread" ); 
        Thread.start(); 
    } 
    / ** 
     デモ用*スレッドロック待ち
     * / 
    パブリック 静的な 無効 createLockThread(最終オブジェクトロック){ 
        スレッドスレッド = 新しいスレッド(新しいRunnableを(){
             公共 ラン(){
                 同期(ロック){
                     試み{ 
                        lock.wait(); 
                    } キャッチ(InterruptedExceptionある電子){ 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        }、 "testLockThread" )。
        thread.start(); 
    } 
    パブリック 静的 ボイドメイン(文字列[]引数)スロー例外{ 
        BufferedReaderのBR = 新しい BufferedReaderの(新しいInputStreamReaderの(System.in))。
        br.readLine(); 
        createBusyThread(); 
        br.readLine(); 
        オブジェクトOBJ = 新しいオブジェクト(); 
        createLockThread(OBJ)。
    } 
}

プログラムの実行後、最初に実行可能状態スレッド、readBytes System.inキーボードの入力方法に待機しているBufferedReaderのメインスレッド、スタックトレース表示に「スレッド」タブを選択し、スレッド実行可能状態、実行時に割り当てられますが、 readBytesメソッドのチェックがすぐに復帰トークンストリームの実行が更新されていないために、待ち時間は非常に少ないCPUリソースを消費します。

 

 

値キーボードを入力した後、次いで、スタックトレースから見て空気の循環を行っているtestBusyThreadスレッドは、ライン41 MonitoringTest.javaコード滞在していた41の動作を監視します。しばらく(真)。この時間スレッド実行可能状態、およびアクションの実行スレッドトークンを返していませんでした、それはすべての実行サイクルタイムのスペースが不足しますスレッドの切り替えまで、待機はより多くのCPUリソースを消費します

 

 

ロックオブジェクトを待つ場合にtestLockThreadスレッド通知またはのnotifyAllメソッドは、スレッド覚醒されるまでの時間を実行するために割り当てられないので、待ち状態で待機

 

 

 

 デッドロックのコードサンプル

パブリック クラス SynAddRunalbe 実装Runnableを{
     int型A、B。
    公共 SynAddRunalbe(INTINT B){
         この .A = この .B = B; 
    } 

    公共 ボイドラン(){
         同期(Integer.valueOf()){
             同期(Integer.valueOf(B)){ 
                System.out.printlnは( +のB)。
            } 
        } 
    } 
}
パブリック クラスOOMObjectTest3 {
     公共 静的 ボイドメイン(文字列[]引数){
         ためINT I = 0; iが<100; I ++ ){
             新しいスレッド(新しい SynAddRunalbe(1,2 )))(開始。
            新しいスレッド(新しい SynAddRunalbe(2,1 ))(開始)。
        } 
    } 
}

スレッドのデッドロックが表示された後に、「デッドロックを検出し、」JConsoleのスレッドパネルをクリックしてボタンを、新しい「デッドがあるだろうロック」タブ。

 

 

2 VisualVMは:イン・ワンのトラブルシューティングツール

2.1 JConsoleを起動

「jvisualvm.exe」JDK / binディレクトリに起動することで

 

 

2.2プラグインのダウンロード

 「ツール」→「ウィジェット」→「あるメニューキャリア」、その後、搭載されているプラグインがに保存され、インストールすることができますパスNBMパッケージ]ダイアログボックスを指定JDK_HOME / libに/ VisualVMの/ VisualVMの中

プラグインセンターアドレス:のhttp:// VisualVMのjava.net/pluginscenters.html。

 

 

免責事項:この記事では、個人の研究ノート、「綿密なJVMは機能を高度・Java仮想マシンの理解とベストプラクティス」周志明とオンラインの記事からコンテンツです

おすすめ

転載: www.cnblogs.com/xyzshm/p/12602120.html