Java 虚拟机(JVM)是运行 Java 程序的核心组件,JVM 提供了一组命令行工具,帮助开发者监控、调试和优化 Java 应用程序的性能。这些工具对于理解 JVM 的运行时行为、内存管理、垃圾回收机制等至关重要。本文将详细介绍一些常用的 JVM 命令工具,并说明它们的使用场景和用法。
1. java
命令
java
命令是运行 Java 应用程序的基本命令。它启动 JVM 并执行指定的类或 JAR 文件。
1.1 基本语法
java [options] class [args...]
java [options] -jar jarfile [args...]
1.2 常用选项
-classpath
或-cp
:指定类路径,告诉 JVM 从哪里加载类文件。-Xmx<size>
:设置最大堆内存大小。-Xms<size>
:设置初始堆内存大小。-Xss<size>
:设置每个线程的堆栈大小。-Dproperty=value
:设置系统属性。
1.3 示例
java -Xmx512m -Xms256m -cp myapp.jar com.example.Main
这个命令将运行 myapp.jar
,使用 com.example.Main
作为主类,初始堆内存设置为 256MB,最大堆内存设置为 512MB。
2. javac
命令
javac
命令是 Java 编译器,用于将 Java 源代码(.java
文件)编译成字节码(.class
文件)。
2.1 基本语法
javac [options] [sourcefiles...]
2.2 常用选项
-d
:指定输出目录,将编译生成的.class
文件放入该目录。-classpath
或-cp
:指定类路径,用于寻找引用的类文件。-source
:指定源代码的版本。-target
:指定编译生成的字节码版本。
2.3 示例
javac -d bin -sourcepath src -classpath lib/* src/com/example/Main.java
这个命令将 src/com/example/Main.java
编译成 .class
文件,并将生成的字节码放入 bin
目录,lib
目录中的所有 JAR 文件将被包含在类路径中。
3. jps
命令
jps
(Java Virtual Machine Process Status Tool)命令用于列出当前所有运行中的 JVM 进程,类似于 Unix/Linux 下的 ps
命令。
3.1 基本语法
jps [options] [hostid]
3.2 常用选项
-l
:显示完全限定的类名或 JAR 文件名。-v
:显示传递给 JVM 的参数。
3.3 示例
jps -l
这个命令将列出当前机器上所有运行中的 Java 进程及其主类或 JAR 文件名。
输出示例:
12345 com.example.Main
67890 org.apache.catalina.startup.Bootstrap
4. jstack
命令
jstack
命令用于打印 Java 进程的线程堆栈信息。它通常用于诊断线程死锁、长时间运行的线程或 CPU 占用率高的线程。
4.1 基本语法
jstack [options] <pid>
<pid>
:目标 Java 进程的 PID(通过jps
命令获取)。
4.2 常用选项
-l
:显示关于锁的信息。-F
:强制输出线程堆栈,即使目标进程没有响应。
4.3 示例
jstack -l 12345
这个命令将打印 PID 为 12345 的 Java 进程的所有线程的堆栈信息。
输出示例:
"main" #1 prio=5 os_prio=0 tid=0x00007fba58009800 nid=0x39e3 waiting on condition [0x00007fba5e2fa000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.Main.run(Main.java:10)
...
5. jmap
命令
jmap
命令用于生成 Java 进程的内存映射,包括堆的详细信息、堆内存的使用情况,以及可以生成堆转储(heap dump)。
5.1 基本语法
jmap [options] <pid>
5.2 常用选项
-heap
:显示 Java 堆详细信息。-histo
:显示堆中对象的直方图,包括每个对象的数量和总大小。-dump:format=b,file=<filename>
:生成堆转储文件。
5.3 示例
jmap -heap 12345
这个命令将显示 PID 为 12345 的 Java 进程的堆内存使用情况。
jmap -dump:format=b,file=heapdump.hprof 12345
这个命令将生成 PID 为 12345 的 Java 进程的堆转储文件 heapdump.hprof
。
6. jhat
命令
jhat
命令用于分析堆转储文件。它启动一个 HTTP 服务器,允许开发者通过浏览器分析堆转储。
6.1 基本语法
jhat [options] <heap-dump-file>
6.2 常用选项
-port
:指定 HTTP 服务器的端口。-J<flag>
:传递特定的 JVM 选项。
6.3 示例
jhat -J-Xmx512m heapdump.hprof
这个命令将分析 heapdump.hprof
文件,并启动一个 HTTP 服务器,默认端口为 7000,可以在浏览器中访问 http://localhost:7000/
来查看分析结果。
7. jstat
命令
jstat
命令用于监控 JVM 的各种运行时统计信息,如垃圾回收、类加载、编译、内存使用等。它非常适合用于分析 Java 应用的性能问题。
7.1 基本语法
jstat [options] <pid> [interval] [count]
interval
:数据刷新时间间隔(毫秒)。count
:刷新次数。
7.2 常用选项
-gc
:显示垃圾回收的相关信息。-class
:显示类加载器相关信息。-compiler
:显示JIT编译器相关信息。
7.3 示例
jstat -gc 12345 1000 10
这个命令每隔1秒刷新一次PID为12345的Java进程的垃圾回收统计信息,连续刷新10次。
输出示例:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
10240.0 10240.0 0.0 0.0 81920.0 5120.0 163840.0 8192.0 21472.0 21472.0 2048.0 1024.0 5 0.156 1 0.156 0.312
8. jcmd
命令
jcmd
命令是一个多功能工具,它可以用来执行多种任务,如获取 JVM 配置信息、执行 GC、生成线程转储和堆转储等。
8.1 基本语法
jcmd <pid> <command> [options]
8.2 常用命令
GC.run
:触发垃圾回收。Thread.print
:打印线程堆栈。VM.system_properties
:列出系统属性。VM.uptime
:显示JVM运行时间。
8.3 示例
jcmd 12345 GC.run
这个命令将触发PID为12345的Java进程的垃圾回收。
jcmd 12345 Thread.print
这个命令将打印PID为12345
9. `总结
-
java:用于启动Java应用程序的命令。例如,java HelloWorld将会运行名为HelloWorld的Java类。
-
javac:用于编译Java源代码的命令。例如,javac HelloWorld.java将会将名为HelloWorld.java的源文件编译成字节码文件HelloWorld.class。
-
javap:用于反编译Java字节码文件的命令。例如,javap -c HelloWorld将会显示名为HelloWorld.class的字节码文件的反编译结果。
-
jps:用于列出当前运行的Java进程的命令。例如,jps -l将会列出所有Java进程的进程ID和主类的完整路径名。
-
jstat:用于监视Java虚拟机的各种运行状态的命令。例如,jstat -gcutil pid 1000将会每1000毫秒打印一次进程ID为pid的Java虚拟机的GC情况。
-
jmap:用于生成Java虚拟机的堆和内存映像快照的命令。例如,jmap -histo pid将会生成进程ID为pid的Java虚拟机的堆的直方图。
-
jstack:用于生成Java线程的堆栈跟踪的命令。例如,jstack pid将会打印进程ID为pid的Java虚拟机中所有线程的堆栈跟踪。
-
jcmd:用于向正在运行的Java进程发送诊断命令的命令。例如,jcmd pid VM.flags将会显示进程ID为pid的Java虚拟机的各种运行参数。