# JDK 的命令行工具

-Dcom.sun.management.jmxremote 开启 JMX 管理功能;JDK 1.6 以上默认开启。

  • jps:JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程。
  • jstat:JVM Statistics Monitoring Tool,用于收集 HotSpot 虚拟机各方面的运行数据。
  • jinfo:Configuration Info for Java,显示虚拟机配置信息。
  • jmap:Memory Map for Java,生成虚拟机的内存转储快照(heapdump 文件)。
  • jhat:JVM Heap Dump Brower,用于分析 heapdump 文件,建立 HTTP/HTML 服务器,在浏览器上查看分析结果。
  • jstack:Stack Trace for Java,显示虚拟机的线程快照。

# jps

jps—— 虚拟机进程状况工具

jps [ options ] [hostid]

# options

  • -q:只输出 LVMID(Loval Virtual Machine Identifier,对应进程 ID),省略主类的名称。
  • -m:输出虚拟机进程启动时传递给主类 main () 函数的参数
  • -l:输出主类的全名;如果进程执行的是 Jar 包,输出 Jar 包路径。
  • -v:输出虚拟机进程启动时 JVM 参数。

# hostid

通过 RMI 协议查询远程虚拟机进程状态,远程的虚拟机需要开启 RMI 服务。

[protocol:][[//]hostname][:port][/servername]

# jstat

jstat—— 虚拟机统计信息监视工具

jstat [ generalOption | outputOptions vmid [ interval [ s|ms ] [ count ] ] ]

# generalOption | outputOptions

指定 generalOption 后,就对 outputOptions 参数无效了

generalOption

  • -help
  • -version
  • options

outputOptions
jstas -options 命令可以列举支持的选项,或者 man jstat 命令查看每个选项输出结果的说明。

# vmid

如果是本地,则是 LVMID;否则是 hostid

# interval s|ms

默认 ms;interval 监控间隔时间

# count

默认 infinity,监控次数

# jinfo

jinfo——Java 配置信息工具

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [ server-id@ ] remote-hostname-or-IP

# options

  • -flag <name>:打印指定的 VM 值;
  • -flag [+|-]<name>:开启或关闭指定 VM 参数;
  • -flag <name>=<value>:设置 VM 的指定的值;
  • -flags: 打印 VM 的参数,包括默认的 VM 参数;
  • -sysprops:打印系统属性;
  • <no option>:打印 VM 参数和系统属性;
  • -h:帮助。

# jmap

jmap——Java 内存映像工具

jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [ server-id@ ] remote-hostname-or-IP

# options

  • -heap:显示 Java 堆信息;
  • -histo [:live]:统计堆中对象情况;
  • -clstats:统计类加载信息;
  • -finalizerinfo:显示在 F-Queue 队列中等待 Finalizer 线程调用 finalize 方法的对象;
  • -dump:<dump-options>:输出 hprof 格式的文件,dump-options 为:
    • live:显示存活的对象;
    • format=b:二进制文件;
    • file=<filename>:文件名。
      例子:-dump:live,format=b,file=heap.bin;
  • -F:当进程对 - dump 操作无响应时,强制生成快照;
  • -J<flag>:直接传递 flag 给运行中的系统;
  • -h | -help:帮助。

# jhat

jhat—— 虚拟机堆转储快照分析工具,不建议使用:

  • 耗资源;
  • 该分析工具比较简陋;
  • 从服务器中下载转储文件,用可视化工具分析。

# jstack

jstack——Java 堆栈跟踪工具

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

# options

  • -m:混合模式,打印包括 Java 以及本地 C/C++ 的堆栈信息;
  • -l:打印包括锁的信息;
  • -F:当 jstack 输出没响应时,强制输出线程堆栈;
  • -h/-help:帮助。

Java 1.5 之后,java.lang.Thread 新增 getAllStackTraces () 方法用于获取所有线程的 StackTraceElement 对象。

# HSDIS

HSDIS——JIT 生成代码反汇编

# Mac 平台

下载 hsdis-amd64.dylib 插件到以下目录:

/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib

  • -XX:+UnlockDiagnosticVMOptions
  • -XX:+PrintAssembly
  • -Xcomp
  • -XX:CompileCommand=dontinline,*HSDIS.sum
  • -XX:CompileCommand=compileonly,*HSDIS.sum

Product 版 JVM 需要开启 UnlockDiagnosticVMOptions,Debug 或 FastDebug 版可以直接 PrintAssembly;

Xcomp,以编译模式运行;新版移除该参数;

后面两个参数是,不使用内联和只编译 HSDIS 类的 sum 方法。

public class HSDIS {
    int a = 1;
    static int b = 2;
    public int sum(int c) {
        return a + b + c;
    }
    public static void main(String[] args) {
        new HSDIS().sum(3);
    }
}

# JDK 的可视化工具

可视化工具比较直观,简单,不详细介绍。

# JConsole:Java 监视与管理控制台

jconsole 命令直接进入图形界面。

# VisualVM:多合一故障处理工具

下载工具,运行打开图形界面。