title: jconsole的使用
date: 2017-12-19 14:03:12
tags:
jconsole是基于jmx之上的一个jvm的监控工具。监控主要分以下几个区域
- 概览
- 内存
- 线程
- 类
- vm概要
- MBean
本地的jvm程序可以直接启动,远程的jvm程序需要添加jvm参数才能让jconsole实现远程监控。
-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
package cai;
/**
* Created by caiyl on 2017/1/12.
* 死锁demo
*/
public class DeadLockDemo {
private static String A = "A";
private static String B = "B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock() {
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("hasecode"+A.hashCode());
synchronized (A){
System.out.println("synchronized a");
try {
Thread.currentThread().sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (B){
System.out.println("synchronized b");
}
}
}
},"threadone");
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (B){
synchronized (A){
System.out.println("2");
}
}
}
},"threadtwo");
t1.start();
t2.start();
}
}
运行 DeadLockDemo程序,然后启动jconsole,输入程序所在的ip和端口,如下图
jconsole监控内存的使用情况,如下图所示,可以选择图表下拉框选择监控不同的区域,详细信息显示该区域已使用和最大值。
[图片上传失败...(image-2b9fdf-1513670619480)]
jconsole可以显示线程的状态,总数,堆栈。如下图
[图片上传失败...(image-299156-1513670619480)]
检测死锁
jconsole还有个强大的功能,检测死锁。点击检测死锁按钮,可以检测到死锁,如图中的线性threadone和线程threadtwo就是一对死锁,大家互相等待。
[图片上传失败...(image-ee4514-1513670619480)]
从图中可以看到线程threadone在等待锁java.lang.String@753ce0d9,改锁被threadtwo占有,同时线程threadone占有锁java.land.String@5b3f92c4。同样threadtwo在等待threadone占有的锁。如下图
[图片上传失败...(image-e15c8a-1513670619480)]