目 录CONTENT

文章目录

jdk提供的内置命令行工具

FatFish1
2024-10-31 / 0 评论 / 0 点赞 / 82 阅读 / 0 字 / 正在检测是否收录...

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.allocateMemoryDirectByteBuffer申请的内存,但是不包含其他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

0

评论区