现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:

    • 本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。
命令行参数选项说明如下:
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
命令行参数选项说明如下: jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用
得到21742的十六进制值为54ee,下面会用到。

 

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

 

// 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) {
    }
}

jmap导出堆内存,然后使用jhat来进行分析,jmap语法格式如下:

如果运行在64位JVM上,可能需要指定-J-d64命令选项参数。 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:5款强大的JVM 性能调优监控工具,您值得拥有 !_Java
使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。比如下面的例子: 使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下: class name是对象类型,说明如下: 还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下: 我一样地对上面进程ID为21711进行Dump: dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看: 注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了:5款强大的JVM 性能调优监控工具,您值得拥有 !_JVM_02
上面红线框出来的部分大家可以自己去摸索下,最后一项支持OQL(对象查询语言)。

语法格式如下:

  • vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。

  • interval是采样时间间隔。

  • count是采样数目。

root@ubuntu:/# jstat -gc 21711 250 4
S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
192.0  192.0   64.0   0.0    6144.0   1854.9   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   2109.7   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649

 

  • 堆内存 = 年轻代 + 年老代 + 永久代

  • 年轻代 = Eden区 + 两个Survivor区(From和To)

 

五、hprof(Heap/CPU Profiling Tool):

CPU Usage Sampling Profiling(cpu=samples)的例子:
上面每隔20毫秒采样CPU消耗信息,堆栈深度为3,生成的profile文件名称是java.hprof.txt,在当前目录。

javac -J-agentlib:hprof=cpu=times Hello.java

javac -J-agentlib:hprof=heap=sites Hello.java

javac -J-agentlib:hprof=heap=dump Hello.java