查看PID信息
首先启动一个服务
使用jps 和 jps -l 的区别,使用jps -l 能够显示出服务的名称
熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK
JMAP、JSTAT和JSTACK是Java开发中常用的工具,用于分析和调试Java应用程序。它们的使用场景如下:
JMAP:JMAP用于生成Java堆转储快照,以便分析Java应用程序的内存使用情况。它可以提供关于对象数量、类型、大小等信息,帮助识别内存泄漏或者内存溢出问题。
JSTAT:JSTAT用于监视和收集Java虚拟机(JVM)的各种统计数据,例如垃圾回收情况、类加载情况、线程数量等。它可以实时显示这些统计数据,帮助开发人员了解应用程序的性能状况。
JSTACK:JSTACK用于生成Java线程转储快照,以便分析Java应用程序的线程状态和调用栈信息。它可以帮助开发人员定位死锁、死循环、线程阻塞等问题,并提供线程运行轨迹,有助于进行线程级别的故障排查。
JCMD是一个多功能的工具,它是一个运用更为全面的工具,可用于获取目标 Java 进程的性能统计、内存使用、垃圾收集、线程堆栈、JVM 运行时间,GC、导出线程信息、堆信息等、简单理解为它可以直接使用相关的名称获取信息
综上所述,JMAP适用于内存分析,JSTAT适用于性能监控,JSTACK适用于线程分析。根据具体的问题和需求,选择合适的工具可以更好地帮助开发人员进行调试和优化。
JMAP的使用
JMAP是一个命令行工具,用于生成Java堆转储快照。
以下是JMAP的使用方法和常用属性的解析:
使用方法:
输入jmap -<option> <pid>,其中<option>为JMAP的选项,<pid>为Java进程的进程ID。
常用选项(属性):
heap: 生成Java堆转储快照。示例:jmap -heap <pid>
histo: 生成Java堆中对象的统计信息,包括对象数量、类型和大小等。示例:jmap -histo <pid>
dump: 生成Java堆转储快照,并保存到文件中。示例:jmap -dump:format=b,file=<filename> <pid>
finalizerinfo: 显示等待终结的对象信息。示例:jmap -finalizerinfo <pid>
clstats: 显示类加载器的统计信息。示例:jmap -clstats <pid>
permstat: 显示永久代(PermGen/Metaspace)的统计信息。示例:jmap -permstat <pid>
也可以在服务中查看:
例如:jmap -heap <pid>
参数说明:
Heap Configuration: #堆配置情况
MinHeapFreeRatio #堆最小使用比例
MaxHeapFreeRatio #堆最大使用比例
MaxHeapSize #堆最大空间
NewSize #新生代初始化大小
MaxNewSize #新生代可使用最大容量大小
OldSize #老生代大小
NewRatio #新生代比例
SurvivorRatio #新生代与suvivor的占比
MetaspaceSize #元数据空间初始大小
CompressedClassSpaceSize #类指针压缩空间大小, 默认为1G
MaxMetaspaceSize #元数据空间的最大值, 超过此值就会触发 GC溢出( JVM会动态地改变此值)
G1HeapRegionSize #区块的大小
Heap Usage:
G1 Heap:
regions # G1区块初始化大小
capacity #G1区块最大可使用大小
used #G1区块已使用内存
free #G1区块空闲内存
18.137190118432045% used #G1区块使用比例
G1 Young Generation: #新生代
Eden Space: #Eden区空间
regions = 670
capacity = 2699034624 (2574.0MB)
used = 1405091840 (1340.0MB)
free = 1293942784 (1234.0MB)
52.05905205905206% used
Survivor Space: #Survivor区
regions = 3
capacity = 6291456 (6.0MB)
used = 6291456 (6.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation: #老生代
regions = 72
capacity = 1589641216 (1516.0MB)
used = 146589472 (139.79861450195312MB)
free = 1443051744 (1376.2013854980469MB)
9.221544492213267% used
JSTAT的使用
JSTAT是一个用于监视和收集Java虚拟机(JVM)统计数据的命令行工具。它提供了多个选项和属性,用于显示不同方面的JVM统计信息。
以下是JSTAT的使用方法和常用属性的解析:
使用方法:
输入jstat -<option> <pid> [<interval> [<count>]]
其中<option>为JSTAT的选项,<pid>为Java进程的进程ID,
<interval>为采样间隔时间(以毫秒为单位),<count>为采样次数。
常用选项(属性):
-class:显示类加载、卸载数量和总空间等信息。
-compiler:显示JIT编译器的编译任务和耗时等信息。
-gc:显示垃圾回收器的统计信息,包括堆内存使用、GC时间、吞吐量等。
-gcutil:显示垃圾回收器的详细统计信息,包括堆内存使用、GC时间、吞吐量、GC持续时间等。
-gccause 显示GC触发的原因的时间等
-gccapacity:显示堆内存容量和使用情况的详细信息。
-gcnew:显示新生代垃圾回收器的统计信息。
-gcnewcapacity:显示新生代堆内存容量和使用情况的详细信息。
-gcold:显示老年代垃圾回收器的统计信息。
-gcoldcapacity:显示老年代堆内存容量和使用情况的详细信息。
-gcpermcapacity:显示永久代(PermGen/Metaspace)容量和使用情况的详细信息。
也可以在Linux中查看具体的选项:
例如:jstat -gcutil 23397 1000 15 -- 每秒中打印一次,打印15次
也可以换成如下写法:
通过查看 新生代、老年代以及GC的次数、时间、调整服务启动参数的设置
参数解析:
S0: 幸存者区(Survivor)0的使用百分比。
S1: 幸存者区(Survivor)1的使用百分比。
E: 伊甸园(Eden)区的使用百分比。
O: 老年代(Old Generation)的使用百分比。
M: 元空间(Metaspace)的使用百分比。
CCS: 压缩类空间(Compressed Class Space)的使用百分比。
YGC: 年轻代垃圾回收的次数。
YGCT: 年轻代垃圾回收的总时间(以秒为单位)。
FGC: Full GC(全局垃圾回收)的次数。
FGCT: Full GC(全局垃圾回收)的总时间(以秒为单位)。
GCT: 所有垃圾回收的总时间(以秒为单位)。
NGCMN: 年轻代最小容量(以KB为单位)。
NGCMX: 年轻代最大容量(以KB为单位)。
NGC: 年轻代当前容量(以KB为单位)。
OGCMN: 老年代最小容量(以KB为单位)。
OGCMX: 老年代最大容量(以KB为单位)。
OGC: 老年代当前容量(以KB为单位)。
MCMN: 元空间最小容量(以KB为单位)。
MCMX: 元空间最大容量(以KB为单位)。
MC: 元空间当前容量(以KB为单位)。
CCSMN: 压缩类空间最小容量(以KB为单位)。
CCSMX: 压缩类空间最大容量(以KB为单位)。
CCSC: 压缩类空间当前容量(以KB为单位)。
通过分析这些参数信息,可以了解垃圾回收器的使用情况、堆内存的使用情况和变化趋势等,帮助识别内存问题并进行性能调优。
例如:jstat -gccause 23397 1s 10 -- 查看GC的原因
JSTACK的使用
jstack是一个用于生成Java线程转储快照的命令行工具,它可以帮助分析和诊断Java应用程序中的线程问题。
使用方法:
输入jstack [-m] <pid>,其中<pid>为Java进程的进程ID。
常用选项(属性):
-l:输出长格式线程转储,包括锁信息。
-F:当目标Java进程无响应时,强制生成线程转储。
-m:输出Java和本地堆栈信息。
-h:显示帮助信息。
输出解析:
jstack输出的内容包含了当前Java进程中所有线程的堆栈跟踪信息。每个线程的堆栈跟踪以线程ID开始,并按照调用层次结构显示方法调用序列。
以下是一些常见的线程状态和属性的解析:
java.lang.Thread.State:线程的状态,如RUNNABLE(运行中)、WAITING(等待中)、TIMED_WAITING(定时等待中)等。
at <class>.<method>(<file>:<line>):方法调用的堆栈跟踪信息,包括类名、方法名和源代码文件位置。
Locked <monitor>:线程正在持有某个监视器锁。
Waiting on <monitor>:线程正在等待某个监视器锁。
Blocked on <monitor>:线程被阻塞在某个监视器锁上。
通过分析线程转储快照,可以了解Java应用程序中各个线程的状态、堆栈跟踪信息以及可能存在的死锁或性能问题。这对于诊断和解决线程相关的问题非常有帮助。
请注意,jstack命令需要与目标Java进程具有相同的用户权限才能执行成功。另外,建议在生产环境中谨慎使用该命令,以避免对应用程序性能产生不利影响。
例如: jstack -l 23397
JCMD的使用
使用帮助文档:
使用 jcmd 获取服务进程
使用 jcmd <pid> help 获取可执行命令
例如: jcmd 23397 GC.heap_info
例如: jcmd 23397 Thread.print
总之,jcmd是一个功能强大的工具,可以帮助开发人员和运维人员对Java应用程序进行诊断、监控和管理,从而提高应用程序的可靠性和性能。