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课程