jconsoleの紹介

記事のソース:https://blog.csdn.net/qq_31156277/article/details/80035430

@JConsoleの紹介

1.1 JConsoleの説明

Jconsole(Java監視および管理コンソール)、JMXに基づく視覚的な監視および管理ツール。

1.2 JConsoleを起動する

  • JDK / binディレクトリの下をクリックしjconsole.exeて開始します
  • 次に、このマシンで実行されているすべての仮想マシンプロセスを自動的に検索します。
  • 監視を開始するプロセスの1つを選択します

JConsole接続


1.3 JConsoleの基本的な紹介

JConsoleの基本は、以下の基本的な含み概述の機能を:内存线程VM概要、、MBean

次のプログラムを実行し、JConsole監視に使用して、仮想マシンのパラメーターの設定に注意してください

import java.util.ArrayList;
import java.util.List;

/**
 *  设置虚拟机参数:
 *  -Xms100M -Xms100m -XX:+UseSerialGC -XX:+PrintGCDetails
 */
public class JConsoleTool {
    
    

    static class OOMObject {
        public byte[] placeholder = new byte[64 * 1024];
    }

    public static void fillHeap(int num) throws InterruptedException {
        Thread.sleep(20000); //先运行程序,在执行监控
        List<OOMObject> list = new ArrayList<OOMObject>();
        for (int i = 0; i < num; i++) {
            // 稍作延时,令监视曲线的变化更加明显
            Thread.sleep(50);
            list.add(new OOMObject());
        }
        System.gc();
    }

    public static void main(String[] args) throws Exception {
        fillHeap(1000);
        while(true){
            //让其一直运行着
        }

    }
}

 
  
  
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26日
  • 27日
  • 28
  • 29日
  • 30
  • 31
  • 32
  • 33

1.3.1メモリ監視

ビジュアルjstatコマンドと比較して、メモリタブは、コレクターが管理する仮想マシンのメモリを監視するために使用されます。

オプション 解説
Eden Space サイズ 27328KB
中古 使用しています
提出済み 27328KB
マックス 27328KB
0.120s on copy(3コレクション) 新世代は、割り当てアルゴリズム(コピー)、0.120秒、合計3回を使用します
MarkSweepCompactの0.037(1コレクション) 古い時代は、マークのクリアと並べ替えを使用します。これには0.037回、合計1回かかります

対応するGCログ。

[GC (Allocation Failure) [DefNew: 27277K->3392K(30720K), 0.0349173 secs] 27277K->14749K(99008K), 0.0350411 secs] [Times: user=0.03 sys=0.00, real=0.04 secs] 

[GC (Allocation Failure) [DefNew: 30691K->3378K(30720K), 0.0446635 secs] 42049K->39217K(99008K), 0.0447387 secs] [Times: user=0.03 sys=0.01, real=0.04 secs] 

[GC (Allocation Failure) [DefNew: 30679K->3372K(30720K), 0.0408609 secs] 66518K->64734K(99008K), 0.0409604 secs] [Times: user=0.02 sys=0.02, real=0.04 secs] 

[Full GC (System.gc()) [Tenured: 61362K->66352K(68288K), 0.0372192 secs] 67024K->66352K(99008K), [Metaspace: 9535K->9535K(1058816K)], 0.0373411 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

 
  
  
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8

1.3.2スレッドの監視

上記の「メモリ」タブがビジュアルjstatコマンドに相当する場合、「スレッド」タブの機能はビジュアルjstackコマンドに相当します。このタブを使用して、スレッドが停止したときに監視および分析を実行できます。メインスレッドの長い一時停止は次のとおりです:(等待外部资源データベース接続、ネットワークリソース、機器、資本
ソースなど)、、 死循环(ライブ锁等待


次の3つのメソッドは、コンソール入力、無限ループのデモ、スレッドロックのデモを待機しています

/**
  * 等待控制台输入
  * @throws IOException
  */
 public static  void waitRerouceConnection () throws IOException {
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     br.readLine();
 }
/**
 * 线程死循环演示
 */
 public static void createBusyThread() {
     Thread thread = new Thread(new Runnable() {
         @Override
         public void run() {
             while (true)   // 第41行
                 ;
         }
     }, "testBusyThread");
     thread.start();
 }

 /**
  * 线程锁等待演示
  */
 public static void createLockThread(final Object lock) {
     Thread thread = new Thread(new Runnable() {
         @Override
         public void run() {
             synchronized (lock) {
                 try {
                     lock.wait();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }
     }, "testLockThread");
     thread.start();
 }
 
  
  
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26日
  • 27日
  • 28
  • 29日
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

(2)スレッドのデッドロックのデモ

このコードは200スレッドを開き、それぞれ1 + 2と2 + 1の値を計算します。実際、forループは省略できます。2つのスレッドもデッドロックを引き起こす可能性があります。ただし、確率が小さすぎるため、何度も実行する必要があります。効果を見るために。一般的に言って、forループを備えたバージョンが最大2〜3回実行されると、スレッドのデッドロックが発生し、プログラムを終了できません。デッドロックが発生する理由は、Integer.valueOf()メソッドが、オブジェクト作成の数を減らしてメモリを節約することを考慮しているためです。valueOf()メソッドがここのパラメータを渡すと、[-128、127]の間の数がキャッシュされます[3]。スコープ内では、キャッシュ内のオブジェクトが直接返されます。つまり、コードでInteger.valueOf()メソッドが200回呼び出され、2つの異なるオブジェクトのみが返されました。スレッド切り替えが特定のスレッドの2つの同期ブロック間で発生した場合、スレッドAはスレッドBによって保持されるInteger.valueOf(1)を待機し、スレッドBはスレッドAが保持するのを待機します。 Integer.valueOf(2)を使用すると、結果が
シーンを下回らないように見えます。

package com.jvm;

/**
 * 线程死锁验证
 */
public class JConsoleThreadLock {
    
    

    /**
     * 线程死锁等待演示
     */
    static class SynAddRunalbe implements Runnable {
        int a, b;
        public SynAddRunalbe(int a, int b) {
            this.a = a;
            this.b = b;
        }

        @Override
        public void run() {
            synchronized (Integer.valueOf(a)) {
                synchronized (Integer.valueOf(b)) {
                    System.out.println(a + b);
                }
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new SynAddRunalbe(1, 2)).start();
            new Thread(new SynAddRunalbe(2, 1)).start();
        }
    }


}

 
  
  
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26日
  • 27日
  • 28
  • 29日
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

スレッドのデッドロック

結果の説明:スレッドThread-53スレッドThread-66保持するIntegerオブジェクトを待機しThread-6ていることを示し、スレッド6をクリックすると、スレッドが保持するIntegerオブジェクトも待機しているThread-53ため、2つのスレッドが互いにスタックし、ロックが解除されるまで待機しません。望む


2、VisualVMの紹介

VisualVM(オールインワンJavaトラブルシューティングツール)、最も強力な操作監視およびトラブルシューティングプログラム

2.1機能の説明

  • VM処理及び表示処理配置环境信息jpsjinfo)。
  • 監視用途のためCPU、、 GCメソッド領域(1.7以前)、 元空间後JDK1.8と)と线程情報(JSTAT、jstack)。
  • ダンプと分析堆转储快照(jmap、jhat)。
  • メソッドレベル程序运行性能分析、最も呼び出され、実行時間が最も長いメソッド見つけます
  • オフラインプログラムのスナップショット:プログラムのランタイム構成、スレッドダンプ、メモリダンプ、その他の情報を収集してスナップショットを作成します

2.2チュートリアル

使い方は公式サイトと本書チュートリアルをチェックしてください。


情報を見る

おすすめ

転載: blog.csdn.net/aiwaston/article/details/104936444