JVM调优之性能监控工具

一、jstack

1.1 jstack简介

jstack是JDK自带的堆栈追踪工具,通过jstack可以生成指定进程号的线程快照,通过线程快照可以快速获取到各线程的状态,从而分析出程序长时间卡顿、cpu过高、死锁等原因

1.2 jstack使用

运行一个死锁的程序,以下是死锁程序的实例代码:

public class JstackTest {

    private static Object l1 = new Object();


    public static void main(String[] args) {
        for(int i = 0; i < 3; i++) {
            new Thread(()->{
                synchronized (l1) {
                    System.out.println(Thread.currentThread().getName() + " is RUNNABLE");
                    while (true) {
                    }
                }
            }, "thread-" + i).start();
        }
    }

}

运行后打印拿到锁的是0号线程

使用top命令找到cpu占用率最高的进程

使用top -Hp 9589找到进程中cpu占用率最高的线程,可以看到打印出来的COMMAND对应的是刚刚拿到锁的线程名,这也是在阿里规范中线程名要取的有意义的原因,为了方便定为问题

 再将对应线程的PID转化成16进制,方便查看堆栈信息时,能快速找到我们需要的信息

 printf "%x\n" 9622

 再使用jstack获取堆栈快照

jstack 9589 | grep -A10 -B20 2596

通过获取的快照可以得知,3个线程中,线程0处于RUNNABLE状态,拿到了锁,并运行在代码12行处,线程1和2是处于BLOCKED状态,都在等待线程0释放锁。其中nid是JVM线程映射OS中的线程编号

 二、jstat 

2.1 jstat简介

通过jstat工具可以实时监控JVM的堆和非堆的内存使用情况,以及各种GC的状况

使用jstat -option可以列出当前JVM支持的指令,其中jstat -gc是比较常用的

2.2 jstat -gc 使用方式

使用方式是:jstat -gc <pid>

能获取到一些列,列代表的意思是:

S0C第一个Survivor容量
S1C第二个Survivor容量
S0U第一个Survivor已使用容量
S1U第二个Survivor已使用容量
ECEden区容量
EUEden区已使用容量
OC老年代容量
OU老年代已使用容量
MC元空间大小
MU元空间使用大小
YGC年轻代GC次数
YGCT年轻代GC耗时
FGC老年代GC次数
FGCT老年代GC时间
GCTGC总耗时

三、jmap

3.1 jmap简介

jmap是JVM自带的内存分析工具,能够生成堆栈的dump文件,还能查询堆中的详细信息,如使用了哪种垃圾回收器等信息

3.2 jmap使用

jmap -dump:format=b,file=name.dump <pid>生成堆的快照文件,再根据工具进行分析
jmap -finalizerinfo <pid>打印等待finalize方法的对象
jmap -histo[:live] <pid>打印堆中所有对象的数量和大小,加live只返回存活的对象,这个命令会先gc再统计信息
jmap -heap <pid>打印堆中配置信息,GC回收器情况,堆内存使用情况
 jmap -clstats <pid>打印类加载器的信息
-F强制后面的指令执行,与-dump或-histo一起使用。如:jmap -F -histo <pid>

3.3 注意事项

jmap在使用时,可能会对正在运行的程序造成卡顿等影响,如果要在出现OOM就生成dump,可以使用-XX:+HeapDumpOnOutOfMemoryError参数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值