java_dump命令
在 Java 运维和调试中,"dump" 主要指的是生成 Java 进程的堆内存转储(Heap Dump)、线程转储(Thread Dump)和其他诊断信息。以下是常用的生成 dump 文件的 Java 命令和工具:
1. 生成 Heap Dump(堆内存转储)
Heap Dump 是 Java 应用的内存快照,通常用于分析内存泄漏、性能问题等。
jmap
jmap
是生成堆转储的常用命令。可以通过该命令创建堆转储文件,用于内存分析工具(如 Eclipse MAT 或 VisualVM)进一步分析。
-
命令示例:
生成堆转储文件:
jmap -dump:format=b,file=heap_dump.hprof <PID>
-
参数说明:
format=b
:指定转储格式为二进制格式(.hprof
)。file=heap_dump.hprof
:指定生成的堆转储文件名。<PID>
:目标 Java 进程的进程 ID。
-XX:+HeapDumpOnOutOfMemoryError
当 Java 程序遇到 OutOfMemoryError
错误时,JVM 会自动生成堆转储。可以在 JVM 启动参数中配置。
-
JVM 启动参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof
-
参数说明:
-XX:+HeapDumpOnOutOfMemoryError
:启用在发生OutOfMemoryError
时生成堆转储。-XX:HeapDumpPath=/path/to/heapdump.hprof
:指定堆转储文件的路径。
2. 生成 Thread Dump(线程转储)
线程转储包含了 JVM 进程中所有线程的状态信息,通常用于排查线程死锁和性能问题。
jstack
jstack
可以获取指定 Java 进程的线程堆栈信息。
-
命令示例:
生成线程转储:
jstack <PID> > thread_dump.txt
-
参数说明:
<PID>
:目标 Java 进程的进程 ID。thread_dump.txt
:输出线程转储信息的文件。
kill -3
在 Unix/Linux 系统中,向 Java 进程发送 SIGQUIT
信号(信号 3
)也会生成线程转储。这个方法不需要额外的工具,直接通过系统命令实现。
-
命令示例:
kill -3 <PID>
-
效果:
向 Java 进程发送SIGQUIT
信号后,JVM 会将线程转储输出到标准输出或日志文件中,通常是stdout
或catalina.out
(Tomcat 环境)。
3. 生成 Native Dump(本地转储)
本地转储包含了 JVM 崩溃时的本地代码堆栈信息,通常用于 JVM 崩溃时的调试。
-XX:+CreateMinidumpOnCrash
当 JVM 崩溃时,生成最小的本地转储(MiniDump)文件。
- JVM 启动参数:
-XX:+CreateMinidumpOnCrash
-XX:NativeMemoryTracking=summary
启用本地内存追踪,帮助分析内存分配情况。
- JVM 启动参数:
-XX:NativeMemoryTracking=summary
4. 生成 Class Dump(类转储)
类转储用于查看 JVM 加载的类信息。
-XX:+UnlockDiagnosticVMOptions -XX:+PrintLoadedClasses
通过 JVM 启动参数,可以打印出 JVM 加载的所有类的信息。
- JVM 启动参数:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintLoadedClasses
5. 其他调试 Dump 命令
jcmd
jcmd
提供了更灵活的诊断命令,可以生成多个不同类型的 dump 文件。
- 命令示例:
jcmd <PID> GC.heap_info # 查看堆内存信息 jcmd <PID> VM.native_memory summary # 查看本地内存使用情况 jcmd <PID> Thread.print # 打印线程堆栈信息
6. JVM 配置项
-XX:HeapDumpPath=<path>
:指定生成堆转储文件的路径。-XX:+HeapDumpOnOutOfMemoryError
:当发生OutOfMemoryError
时自动生成堆转储。