【JVM进阶之路】九:性能监控工具-可视化工具篇

内存的作用相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存。

它不仅包含堆内存的整体信息,更细化到eden区、suvivior区、老年代的使用情况。

JConsole内存监控

为了更加清晰地查看内存地变化,运行下面一段程序,然后连接:

/**

  • VM参数: -Xms100m -Xmx100m -XX:+UseSerialGC

*/

public class JConcoleRAMMonitor {

/***

  • 内存占位符对象,一个OOMObject大约占64KB

*/

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

list.add(new OOMObject());

}

System.gc();

}

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

fillHeap(2000);

}

}

这段代码的作用是以64KB/50ms的速度向Java堆中填充数据,一共填充1000次。

观察Eden区的运行趋势,发现呈折线。观察堆内存使用,发现以稍有曲折的状态向上增长。

Eden区内存变化状况

执行System.gc()之后,老年代的柱状图仍然显示峰值状态,最后程序会以堆内存溢出结束,这是因为空间未能回收——Listlist对象一直存活, fillHeap()方法仍然没有退出,如果把 System.gc()移动到fillHeap()方法外调用就可以回收掉全部内存。

1.4、线程监控


JConcole还可以监控线程,相当于可视化的jstack命令。如图,JConcole显示了系统内的线程数量,并在屏幕下方显示了程序中所有的线程。单击线程名称,就可以查看线程的栈信息。

JConsole线程监控

使用JConsole还可以快速定位死锁问题。

这是一段会产生死锁的代码:

public class ThreadLockDemo {

/**

  • 线程死锁等待演示

*/

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

}

}

}

}

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值