記事のソース:https://blog.csdn.net/qq_31156277/article/details/80035430
@JConsoleの紹介
1.1 JConsoleの説明
Jconsole(Java監視および管理コンソール)、JMXに基づく視覚的な監視および管理ツール。
1.2 JConsoleを起動する
- JDK / binディレクトリの下をクリックし
jconsole.exe
て開始します - 次に、このマシンで実行されているすべての仮想マシンプロセスを自動的に検索します。
- 監視を開始するプロセスの1つを選択します
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
- 3
- 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
- 3
- 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
- 3
- 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
- 3
- 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処理及び表示処理
配置
、环境信息
(jps
、jinfo
)。 - 監視用途のため
CPU
、、GC
、堆
メソッド領域(1.7以前)、元空间
(後JDK1.8と)と线程
情報(JSTAT、jstack)。 - ダンプと分析
堆转储快照
(jmap、jhat)。 - メソッドレベル
程序运行性能分析
で、最も呼び出され、実行時間が最も長いメソッドを見つけます。 - オフラインプログラムのスナップショット:プログラムのランタイム構成、スレッドダンプ、メモリダンプ、その他の情報を収集してスナップショットを作成します
2.2チュートリアル
使い方は公式サイトと本書チュートリアルをチェックしてください。
情報を見る
- VisualVM公式Webサイトアドレス:ヘルプドキュメント
- BTraceの簡単な紹介
- 「Java仮想マシンの詳細な理解」-Zhou Zhiming