jdk命令行工具的使用方法
这些工具使用一个纯净的jdk镜像包就可以使用。步骤如下:
找一个jdk镜像版本,如:jdk-8u382-linux-x64.tar.gz
上传到环境上,如果是k8s就传到pod里面,上传之前可以给指定目录修改权限:chmod 777 目录
解压jdk镜像包:tar -xzvf jdk-8u382-linux-x64.tar.gz
进入解压的jdk目录的bin目录下,在目录内即可执行命令行工具
常用命令行工具
jps - 虚拟机进程状况工具
jstat - 虚拟机统计信息监视工具
可以专门查看一个线程的情况
./jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>] ]
其中options选项包括输出选项和命令选项
输出选项
如果不指定常规选项,则可以指定输出选项。输出选项决定了 jstat 命令输出的内容和格式,并且由一个 statOption 和任何其他输出选项(-h、-t 和 -J)组成。必须首先关注统计
-statOption
确定 jstat 命令显示的统计信息。以下列出了可用的选项。使用 -options 常规选项显示特定平台安装的选项列表。请参见统计选项和输出
class:显示有关类加载器行为的统计信息
compiler:显示有关 Java HotSpot 虚拟机即时编译器行为的统计信息
gc:显示垃圾收集堆行为的统计信息
gccapacity:显示各代容量及其相应空间的统计信息
gccause:显示垃圾收集统计信息(与 -gcutil 相同)的摘要,以及上次和当前(如果适用)垃圾收集事件的原因
gcnew:显示新一代行为的统计数据
gcnewcapacity:显示关于新一代大小及其相应空间的统计信息
gcold:显示老一代行为的统计信息和元空间统计信息
gcoldcapacity:显示关于老一代大小的统计数据
gcmetacapacity:显示关于元空间大小的统计信息
gcutil:显示垃圾收集统计信息的摘要
printcompilation:显示 Java HotSpot 虚拟机编译方法统计信息
-JjavaOption
将 Java 选项传递给 Java 应用程序启动器。例如,-J-Xms48m 将启动内存设置为 48 MB。
统计选项
-class
类装入器统计
Loaded:加载的类的数目
Bytes:加载的数量大小 KB
Unloaded:卸载类数
Bytes:卸载的数量大小 KB
Time:执行类加载和卸载操作所花费的时间
-compiler
Java HotSpot 虚拟机即时编译器统计信息
Compiled:执行编译任务数
Failed:编译任务失败的次数
Invalid:无效的编译任务数
Time:执行编译任务花费的时间
FailedType:上次编译失败的编译类型
FailedMethod:上次编译失败的类名和方法
-gc
收集垃圾回收统计信息
S0C:年轻代中第 1 个 survivor(幸存区)的容量上限(KB)
S1C:年轻代中第 2 个 survivor(幸存区)的容量上限(KB)
S0U:年轻代中第 1 个 survivor(幸存区)的已使用容量(KB)
S1U:年轻代中第 2 个 survivor(幸存区)的已使用容量(KB)
EC:年轻代中 Eden(伊甸园)空间容量上限(KB)
EU:年轻代中 Eden(伊甸园)空间已使用容量(KB)
OC:老年代空间容量上限(KB)
OU:老年代已使用容量(KB)
MC:元空间提交大小(KB)
MU:元空间利用率(KB)
CCSC:压缩类提交大小(KB)
CCSU:使用的压缩类空间(KB)
YGC:年轻代 GC 总次数
YGCT:年轻代 GC 总耗时(秒)
FGC:老年代 GC 总次数
FGCT:老年代 GC 总耗时(秒)
GCT:GC 总耗时(秒)
-gccapacity
收集堆内存统计信息
NGCMN:最小新生代容量(KB)
NGCMX:最大新生代容量(KB)
NGC:当前新生代容量(KB)
S0C:当前幸存区 0 容量(KB)
S1C:当前幸存区 1 容量(KB)
EC:当前 eden 空间容量(KB)
OGCMN:老年代最小容量(KB)
OGCMX:老年代最大容量(KB)
OGC:当前老年代容量(KB)
OC:当前老年代大小(KB)
MCMN:最小元空间容量(KB)
MCMX:最大元空间容量(KB)
MC:元空间提交大小(KB)
CCSMN:压缩类空间最小容量(KB)
CCSMX:压缩类空间最大容量(KB)
CCSC:压缩类提交大小(KB)
YGC:年轻代 GC 总次数
FGC:老年代 GC 总次数
-gccause
此选项显示与 -gcutil 选项相同的垃圾收集统计信息摘要,但包括上次垃圾收集事件的原因和当前垃圾收集事件(如果适用)。除了为 -gcutil 列出的列之外,此选项还添加了以下列:
LGCC:上次垃圾收集的原因
GCC:当前垃圾收集的原因
-gcnew
新生代垃圾回收统计信息。
S0C:当前幸存区 0 容量(KB)
S1C:当前幸存区 1 容量(KB)
S0U:当前幸存区 0 使用大小(KB)
S1U:当前幸存区 0 使用大小(KB)
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小(KB)
EC:eden 区的大小(KB)
EU:eden 区的使用大小(KB)
YGC:年轻代 GC 总次数
YGCT:年轻代 GC 总耗时(秒)
-gcnewcapacity
新生代内存信息统计
NGCMN:新生代最小容量(KB)
NGCMX:新生代最大容量(KB)
NGC:当前新生代容量(KB)
S0CMX:最大幸存 0 区大小(KB)
S0C:当前幸存 0 区大小(KB)
S1CMX:最大幸存 1 区大小(KB)
S1C:当前幸存 1 区大小(KB)
ECMX:最大 eden 区大小(KB)
EC:当前 eden 区大小(KB)
YGC:年轻代 GC 总次数
FGC:老年代 GC 总次数
-gcold
老年代垃圾回收信息统计
MC:方法区大小(KB)
MU:方法区使用大小(KB)
CCSC:压缩类空间大小(KB)
CCSU:压缩类空间使用大小(KB)
OC:老年代大小(KB)
OU:老年代使用大小(KB)
YGC:年轻代 GC 总次数
FGC:老年代 GC 总次数
FGCT:老年代 GC 总耗时(秒)
GCT:GC 总耗时(秒)
-gcoldcapacity
老年代内存信息统计
OGCMN:老年代最小容量(KB)
OGCMX:老年代最大容量(KB)
OGC:当前老年代大小(KB)
OC:老年代大小(KB)
YGC:年轻代 GC 总次数
FGC:老年代 GC 总次数
FGCT:老年代 GC 总耗时(秒)
GCT:GC 总耗时(秒)
-gcmetacapacity
元数据空间信息统计
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代 GC 总次数
FGC:老年代 GC 总次数
FGCT:老年代 GC 总耗时(秒)
GCT:GC 总耗时(秒)
-gcutil
总结垃圾回收信息统计
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:Eden(伊甸园)空间容量使用比例
O:老年代空间容量使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代 GC 总次数
YGCT:年轻代 GC 总耗时(秒)
FGC:老年代 GC 总次数
FGCT:老年代 GC 总耗时(秒)
GCT:GC 总耗时(秒)
-printcompilation
JVM编译方法信息统计
Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型
Method:方法名标识
jinfo - java配置信息工具
jmap - java内存映像工具
可以dump出hprof文件,在未产生OOM的情况下提前进行分析,用MAT(Memory Analyzer Tool)进行分析,命令行如下:
./jmap -dump:format=b,file=/tmp/test.hprof [PID]
jhat - 虚拟机堆转储快照分析工具
jstack - java堆栈跟踪工具
可以直接dump出当前java进程中的堆栈信息,用jca工具可以进行分析,与kill3命令类似,命令行如下:
./jstack [PID] > /tmp/jstack.txt
-F 在-I没反应时,强制打印
-I 打印锁相关信息
-l 打印附加信息
-m 混合模式,打印java和本地帧
案例如下:
./jstack -l <PID> | tee -a stack.txt
线程栈状态
其中重点关注:系统线程状态(Native Thread Status)、JVM线程状态。
系统线程状态包括:
deadlock:死锁线程
runnable:执行中线程
blocked:阻塞线程
waiting on condition:正在等待线程,需要结合堆栈分析
对于waiting on condition的,可以看堆栈,如果是业务代码,则可能是某种资源锁导致的,如果发现有网络读写阻塞,可能是网络瓶颈,或防火墙或路由导致的包无法到达
对于jstack出来的结果,可以使用jca工具查看分析。使用如下:
java -jar .\jca4616.jar
把下好的jca工具放到目录下,直接启动即可
jcmd - 性能调优工具
借助jcmd可以输出一些jvm内存使用信息
示例一、通过jcmd输出内存详情
首先在JVM配置项中补充NMT的配置,具体可以参考NMT部分
-XX:NativeMemoryTracking=summary/detail
使用如下命令可以输出JVM内存使用情况:
jcmd <pid> VM.native_memory summary/detail
该命令输出的内存明细。其中reserved为申请内存,当有用到这么多,就会预留这么多,committed为实际使用,这一部分包含堆内内存、Code区域、通过unsafe.allocateMemory
和DirectByteBuffer
申请的内存,但是不包含其他Native Code
(C代码)申请的堆外内存。
示例二、jcmd输出内存快照
替代jmap进行内存快照输出但是不咋好用
jcmd <pid> GC.heap_dump FILE_NAME
pmap - 线程内存快照分析工具
pmap <options> PID <PID…..>
pmap工具是linux的工具,能够查看进程用了多少内存,还能分析内存用在上面环节,对于一些长期占用内存居高不下的程序可以分析其行为,命令简单,信息简洁。返回示例如下:
Address Kbytes Mode Offset Device Mapping
0000000000400000 19416 r-x-- 0000000000000000 0fd:00001 YDService
00000000018f5000 6520 rw--- 00000000012f5000 0fd:00001 YDService
0000000001f53000 540 rw--- 0000000000000000 000:00000 [ anon ]
0000000002206000 181088 rw--- 0000000000000000 000:00000 [ anon ]
字段含义包括:
Address: 内存开始地址
Kbytes: 占用内存的字节数(KB)
RSS: 保留内存的字节数(KB)
Dirty: 脏页的字节数(包括共享和私有的)(KB)
Mode: 内存的权限:read、write、execute、shared、private (写时复制)
Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)
Offset: 文件偏移Device: 设备名 (major:minor)
案例1、通过top找到进程号,通过pmap查看内存
top
pmap -d 30242
案例2、通过排序输出排序后的内存块分布
pmap -x <pid> | sort -n -k3 > pmap-sorted.txt
评论区