在Java应用程序的开发和维护过程中,性能监控和故障处理是至关重要的环节。为了更好地进行这些任务,Java生态系统提供了多种命令行工具。以下是一些常用的性能监控和故障处理工具的详细介绍:
1. jps
(Java Virtual Machine Process Status Tool)
jps
用于列出当前所有运行中的Java进程及其相关信息。
使用示例:
jps -l
输出示例:
12345 com.example.MyApp
67890 sun.tools.jps.Jps
2. jstat
(Java Virtual Machine Statistics Monitoring Tool)
jstat
用于监控JVM内存、垃圾收集、类加载等各种运行时信息。
常用选项:
-gc
:显示垃圾收集相关统计信息。-class
:显示类加载器相关信息。-compiler
:显示JIT编译器相关信息。
使用示例:
jstat -gc 12345 1000 10
输出示例:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 1024.0 1024.0 0.0 256.0 8192.0 4096.0 10240.0 8192.0 2048.0 1024.0 256.0 128.0 10 0.123 5 0.456 0.579
3. jmap
(Java Memory Map Tool)
jmap
用于生成堆转储(heap dump)、查看堆内存详情及分析内存使用情况。
常用选项:
-heap
:打印堆内存摘要信息。-histo
:打印堆中对象的统计信息。-dump
:生成堆转储文件。
使用示例:
jmap -heap 12345
输出示例:
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.8.0_201-b09using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GCHeap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 209715200 (200.0MB)NewSize = 13107200 (12.5MB)MaxNewSize = 13107200 (12.5MB)OldSize = 16777216 (16.0MB)NewRatio = 2SurvivorRatio = 8PermSize = 21757952 (20.75MB)MaxPermSize = 21757952 (20.75MB)
4. jstack
(Java Stack Trace Tool)
jstack
用于打印Java进程的线程栈跟踪信息,帮助诊断线程问题如死锁、线程阻塞等。
使用示例:
jstack 12345
输出示例:
2019-08-13 17:00:47
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode):"Attach Listener" #12 daemon prio=9 os_prio=31 tid=0x00007fe99c003800 nid=0x1503 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Service Thread" #10 daemon prio=9 os_prio=31 tid=0x00007fe99b80e000 nid=0x1303 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Common-Cleaner" #9 daemon prio=8 os_prio=31 tid=0x00007fe99b00e800 nid=0x1103 in Object.wait() [0x000070000d2e2000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000780c04fa0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)- locked <0x0000000780c04fa0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:122)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:126)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)...
5. jinfo
(Java Configuration Info Tool)
jinfo
用于显示或调整Java进程的配置信息,如系统属性和JVM参数。
使用示例:
jinfo -flags 12345
输出示例:
-XX:CICompilerCount=4 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:MaxNewSize=715653120 -XX:NewSize=22282240 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
6. jcmd
(Java Diagnostic Command)
jcmd
是一个多功能的命令行工具,能够执行各种诊断命令,如生成堆转储、线程转储、GC统计等。
常用命令:
GC.run
:触发垃圾收集。Thread.print
:打印线程栈跟踪信息。VM.system_properties
:打印系统属性。
使用示例:
jcmd 12345 GC.run
jcmd 12345 Thread.print
jcmd 12345 VM.system_properties
输出示例:
# 例如:jcmd 12345 VM.system_properties
12345:
{"java.runtime.name" : "Java(TM) SE Runtime Environment","java.vm.version" : "25.201-b09","java.vm.vendor" : "Oracle Corporation",...
}
7. javap
(Java Class File Disassembler)
javap
用于反汇编Java类文件,帮助分析字节码。
使用示例:
javap -c MyClass
输出示例:
Compiled from "MyClass.java"
public class MyClass {public MyClass();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #3 // String Hello, World!5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: return
}
总结
这些命令行工具在Java应用程序的性能监控和故障处理方面非常有用。通过合理使用这些工具,可以有效地监控应用程序的运行状态,诊断和解决各种性能问题和故障。