java virtualvm_JVM-8.JVM 性能监控 可视化

本文介绍了JDK自带的JConsole和VisualVM两款强大的JVM性能监控工具。通过实例详细解析了如何使用JConsole监控内存、线程,以及分析线程状态。同时,介绍了VisualVM的多功能,如监视CPU、GC、堆内存,以及方法级的性能分析,并提及了扩展插件BTrace。

JDK提供的可视化工具主要有JConsole和VirtualVM。

1. JConsole:Java监视与管理控制台

JConsole(Java Monitoring and Management Console)是一个基于JMX(Java Management Extensions,即Java管理扩展)的可视化监视、管理工具。

管理部分是针对JMX MBean进行管理。

1.1. 概述

界面如下,可以看到包括概述,内存,线程,类,VM概要和MBean:

b5093103435a

image.png

概述包括整个虚拟机主要运行数据的概览,包括“堆内存使用情况”,“线程”,“类”,“CPU使用情况”。

1.2 内存

内存页相当于jstat,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势。

以如下代码为例:

/**

*-Xms100m -Xmx100m -XX:+UseSerialGC

*/

public class JConsoleTest {

static class OOMObject {

public byte[] placeholder = new byte[64 * 1024];

}

public static void fillHeap(int num) throws InterruptedException {

List list = new ArrayList<>();

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);

}

}

可以观察到JConsole监控到的情况为:

堆内存总使用量匀速上升

b5093103435a

image.png

Eden取呈现折线状:

Eden区空间为27328KB

未设置-XX:SurvivorRadio参数,默认为8:1,所以新生代空间为27328KB*125% = 34160K

b5093103435a

image.png

1.3线程监控

相当于jstack命令,线程停顿可以用这个标签页进行监控分析。

以如下代码为例:

private static void fillHeap(int num) throws InterruptedException {

List list = new ArrayList<>();

for (int i = 0; i < num; i++) {

Thread.sleep(50);

list.add(new OOMObject());

}

System.gc();

}

public static void createBusyThread() {

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

while (true) {

;

}

}

}, "testBusyThread");

thread.start();

}

public static void creatLockThread(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();

}

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

br.readLine();

createBusyThread();

br.readLine();

Object obj = new Object();

creatLockThread(obj);

}

main线程等待System.in的输入,线程为Runnable的状态

b5093103435a

RUNNABLE 的main线程

testBusyThread一直在while(true)一行停留,也是Runnable状态:

b5093103435a

Runnable的testBusyThread

3.testLockThread线程等待lock对象的notify或者notifyAll方法。处于WAITING状态:

b5093103435a

waiting的testLockThread.png

死锁例子:

static class SycnAddRunnable implements Runnable {

int a, b;

public SycnAddRunnable(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 < 1000; i++) {

new Thread(new SycnAddRunnable(1, 2)).start();

new Thread(new SycnAddRunnable(2, 1)).start();

}

}

b5093103435a

检测到死锁

2. VirtualVM

强大的运行监视和故障处理程序。

显示虚拟机进程和进程的配置,环境信息

监视应用程序的CPU,GC,堆,方法区和线程信息

dump以及分析heapdump文件

方法级的程序运行性能分析

离线程序快照:收集程序的运行时配置,线程dump,内存dump等信息建立的快照

可添加plugin:

推荐:

BTrace:动态加入调试代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值