JVM性能调优监控工具jps、jmap、jstack、jstat使用详解

方式一、top jmap定位

1:测试程序

import java.util.ArrayList;
import java.util.List;

/**
 * @author yuchen
 * @version 1.0
 * @date 2020-04-29 14:29
 */
public class JvmTest {

    public static void main(String[] args) {
        List list = new ArrayList<>();
        for(int i=0;i<1000000;i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(i);
            System.out.println(1);
        }
    }
}

2:top命令查看

理论上 中间可以插入得到进程ID为xxx,第二步找出该进程内最耗费CPU的线程,可以使用top -Hp pid,我这里用第三个,输出类似下面这样: (此过程可以先忽略不用关系,直接看标题3)

TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用

printf "%x\n" 21742

得到21742的十六进制值为54ee,下面会用到。

OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:

root@ubuntu:/# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]

可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait(),我找了下我的代码,定位到下面的代码:

// Idle wait
getLog().info("Thread [" + getName() + "] is idle waiting...");
schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting;
long now = System.currentTimeMillis();
long waitTime = now + getIdleWaitTime();
long timeUntilContinue = waitTime - now;
synchronized(sigLock) {
    try {
        if(!halted.get()) {
            sigLock.wait(timeUntilContinue);
        }
    } 
    catch (InterruptedException ignore) {
    }
}

 它是轮询任务的空闲等待代码,上面的sigLock.wait(timeUntilContinue)就对应了前面的Object.wait()。

 

3:jmap dump倒出

jsp -l查看 (因为mac本地不支持:使用top -H -p命令获取进程中线程信息(其中H:显示进程中线程的情况,p表示进程pid)top -H -p 进程pid),所以我们直接用jmap生成dump日志,由于之后重新启动的上面的测试程序,所以pid变成了21133

$ jmap -dump:format=b,file=/Users/luzhen/Desktop/dumpfile_jmap.hprof 21133
Dumping heap to /Users/luzhen/Desktop/dumpfile_jmap.hprof ...
Heap dump file created

JVM性能调优监控工具jps、jmap、jstack、jstat使用详解_第1张图片 

4:启动jvisualvm

5:用jvisualvm查看jmap倒出的dump文件

JVM性能调优监控工具jps、jmap、jstack、jstat使用详解_第2张图片

 

JVM性能调优监控工具jps、jmap、jstack、jstat使用详解_第3张图片 

 

 

根据显示定位到JvmTest.main的13行: 

方式二、jps方式查看

1:jps -l 查看java进程

JVM性能调优监控工具jps、jmap、jstack、jstat使用详解_第4张图片

2:jstat -gcutil查看堆的信息

$ jps -l
12080 org.jetbrains.jps.cmdline.Launcher
19702 sun.tools.jps.Jps
12054
19693 org.jetbrains.jps.cmdline.Launcher
19694 JvmTest

$ jstat -gcutil 19694 500 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074
  0.00 100.00   0.00  92.83  76.68  79.79      9    6.206     5   14.868   21.074

 

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

 

你可能感兴趣的:(jvm)