JVM进程性能监控工具

1. jps — Java process state, 针对JVM进程的PS命令相关参数:-v 显示启动时给定的JVM参数-q jps默认只带着类的短名称,如果指定-q则只显示pid-l 显示完整类名-m 显示传递给main主函数的参数,例如:

# jps -ml12812 com.cloudera.cmon.firehose.Main --pipeline-type HOST_MONITORING --mgmt-home /usr/share/cmf12705 com.cloudera.cmon.firehose.Main --pipeline-type SERVICE_MONITORING --mgmt-home /usr/share/cmf

2. jinfo — 显示/设置正在运行的JVM进程的扩展参数jinfo需要指定进程的pid,关于flag参数如下:-flag :显示指定的JVM参数值。如果Boolean型值时则显示+,-号-flag [+|-]:设置|取消指定参数的blog值-flag =value使用JVM堆内存设置和测试的测试代码,并在中间加上一行中断:

import java.io.IOException;public class JVMTest {    public static void main(String args[]) throws IOException {        //=====================Begin=========================        System.out.print("Xmx=");        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");        System.out.print("free mem=");        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");        System.out.print("total mem=");        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");        //=====================First Allocated=========================        System.out.println("5MB array allocated");        byte[] b1 = new byte[5 * 1024 * 1024];        System.out.print("Xmx=");        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");        System.out.print("free mem=");        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");        System.out.print("total mem=");        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");    ?    ?int i = System.in.read();        //=====================Second Allocated=========================        System.out.println("10MB array allocated");        byte[] b2 = new byte[10 * 1024 * 1024];        System.out.print("Xmx=");        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");        System.out.print("free mem=");        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");        System.out.print("total mem=");        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");        //=====================OOM=========================        System.out.println("OOM!!!");        System.gc();        byte[] b3 = new byte[40 * 1024 * 1024];    }}

运行这个程序:

java JVMTestXmx=14343.0M#对比,jinfo信息,可以看出是相等的。jinfo -flag MaxHeapSize 31395-XX:MaxHeapSize=16919822336

添加输出GC日志选项:

jinfo -flag +PrintGCDetails 31395

这时按回车继续程序,可以看出在运行最后打印了GC的信息:

Heap PSYoungGen      total 301568K, used 59059K [0x00000006afd00000, 0x00000006c4d80000, 0x0000000800000000)......

3. jmap — 生成Java应用程序的堆快照和对象统计信息,生成的dump文件需要用工具来打开进行分析。参数:-heap ?打印Java堆信息-histo[:live] 打印Java的对象堆的直方图信息。如果指定live,则只统计存货的对象。-permstat ?打印永久代统计信息-finalizerinfo ?打印等待被终结(finalize)的对象信息

4. jstack — 显示线程堆栈信息,常用于程序卡死后的堆栈分析-l 显示锁信息-m 显示Java和native的信息-F 强制dump,当jstack没有响应时使用

5. JConsole — Java SDK自带的图形化工具,非常方便。启动时会提示选择attach到一个JVM进程上。登录后界面如下,实时窗口包括堆内存、线程、类加载和CPU使用率等四个性能概况,另外还包括一些JVM的统计信息。线程面板可以诊断线程状态,堆栈(类似jstack),死锁等信息。

6. Visual VM — 相当于jconsole的升级版,将很多命令行工具的功能整合在一起。同样由JDK免费提供。使用 VisualVM 进行性能分析及调优

参考

JDK Docs葛一鸣老师的JVM课程

JVM进程性能监控工具

相关文章:

你感兴趣的文章:

标签云: