jvm 的一些命令

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. `总结

  1. java:用于启动Java应用程序的命令。例如,java HelloWorld将会运行名为HelloWorld的Java类。

  2. javac:用于编译Java源代码的命令。例如,javac HelloWorld.java将会将名为HelloWorld.java的源文件编译成字节码文件HelloWorld.class。

  3. javap:用于反编译Java字节码文件的命令。例如,javap -c HelloWorld将会显示名为HelloWorld.class的字节码文件的反编译结果。

  4. jps:用于列出当前运行的Java进程的命令。例如,jps -l将会列出所有Java进程的进程ID和主类的完整路径名。

  5. jstat:用于监视Java虚拟机的各种运行状态的命令。例如,jstat -gcutil pid 1000将会每1000毫秒打印一次进程ID为pid的Java虚拟机的GC情况。

  6. jmap:用于生成Java虚拟机的堆和内存映像快照的命令。例如,jmap -histo pid将会生成进程ID为pid的Java虚拟机的堆的直方图。

  7. jstack:用于生成Java线程的堆栈跟踪的命令。例如,jstack pid将会打印进程ID为pid的Java虚拟机中所有线程的堆栈跟踪。

  8. jcmd:用于向正在运行的Java进程发送诊断命令的命令。例如,jcmd pid VM.flags将会显示进程ID为pid的Java虚拟机的各种运行参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值