十九.性能测试-JVM分析工具(linux)

tech2025-07-31  36

linux环境下常用的jvm分析工具有这几类:jps,jstack,jmap,jstat

一、JPS

执行jps -h查看相关命令语法。多用于查看进程jvm运行情况。

常用命令:

# hostid语法如下: [protocol:][[//]hostname][:port][/servername] protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议,如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。 hostname - 服务器的IP或者名称,没有指定则表示本机。 port - 远程rmi的端口,如果没有指定则默认为1099。 Servername - 注册到RMI注册中心中的jstatd的名称。 # 如果不指定hostid就默认为当前主机或服务器。 # 命令行参数选项 -q 忽略输出类名、Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l 输出main类或Jar的全限名 -v 输出传入JVM的参数 -V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=<filename>指定的文件) -J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。

例如:jps -v

二、jstack

输入jstack -h查看命令语法,用于查看进程的线程堆栈情况。 线程有如下几种形式: NEW:未启动的。不会出现在Dump中。 RUNNABLE:在虚拟机内执行的。 WATING:无限期等待另一个线程执行特定操作。 TIMED_WATING:有时限的等待另一个线程的特定操作。 TERMINATED:已退出的。 BLOCKED:受阻塞并等待监视器锁。(重点关注) DEADLOCK:死锁。(重点关注) Waiting on condition:等待资源(重点关注) Waiting on monitor entry:等待获取监视器(重点关注)

常用命令

jstack [option] pid jstack [option] executable core jstack [option] [server-id@]remote-hostname-or-ip # 命令行参数选项说明如下: -l 长列表,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法) -F 当’jstack [-l] pid’没有相应的时候强制打印栈信息

例如要查看死锁的信息:

三、jmap与jhat

jmap命令可以获得运行中的jvm的堆的快照,检查内存泄漏,检查一些大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。

jmap -heap pid:通过可查看堆内存的配置情况及使用情况 jmap -histo pid:统计对象的创建数量 jmap -dump:format=b,file=heapDump pid:生成dump文件与jhat配合使用 jhat -port xxxx heapDump:浏览器访问localhost:xxxx即可查看dump

-heap: -histo -dump

堆dump下来以后可以结合jhat命令启动启动监听程序 如果对文件太大,可以指定固定大小

在浏览器中输入主机地址:9998查看

四、jstat

jstat命令主要针对以下几点: 1)类的加载及卸载情况 2)查看新生代、老生代及持久代的容量及使用情况 3)查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间 4)查看新生代中Eden区及Survior区中容量及分配情况等

常用命令大全

jstat -class 1477 类加载统计

Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间

jstat -compiler 1477 编译统计

Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法

jstat -gc 1477 垃圾回收统计

S0C:第一个幸存区的大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:老年代使用大小 MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 CCSU:压缩类空间使用大小 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -gcnew 1477 新生代垃圾回收统计

S0C:第一个幸存区大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 TT:对象在新生代存活的次数 MTT:对象在新生代存活的最大次数 DSS:期望的幸存区大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间

jstat -gccapacity 1477 堆内存统计

NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:当前新生代容量 S0C:第一个幸存区大小 S1C:第二个幸存区的大小 EC:伊甸园区的大小 OGCMN:老年代最小容量 OGCMX:老年代最大容量 OGC:当前老年代大小 OC:当前老年代大小 MCMN:最小元数据容量 MCMX:最大元数据容量 MC:当前元数据空间大小 CCSMN:最小压缩类空间大小 CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代gc次数 FGC:老年代GC次数

jstat -gcnewcapacity 1477 新生代内存统计

NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:当前新生代容量 S0CMX:最大幸存1区大小 S0C:当前幸存1区大小 S1CMX:最大幸存2区大小 S1C:当前幸存2区大小 ECMX:最大伊甸园区大小 EC:当前伊甸园区大小 YGC:年轻代垃圾回收次数 FGC:老年代回收次数

jstat -gcold 1477 老年代垃圾回收统计

MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 CCSU:压缩类空间使用大小 OC:老年代大小 OU:老年代使用大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -gcoldcapacity 1477 老年代内存统计

OGCMN:老年代最小容量 OGCMX:老年代最大容量 OGC:当前老年代大小 OC:老年代大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -gcpermcapacity 1477 JDK7永久代内存统计

PGCMN:最小永久代容量 PGCMX:最大永久代容量 PGC:当前新生成的永久代空间大小 PC :永久代空间大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -gcmetacapacity 1477 JDK8元数据空间统计

MCMN:最小元数据容量 MCMX:最大元数据容量 MC:当前元数据空间大小 CCSMN:最小压缩类空间大小 CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -gcutil 1477 垃圾回收统计详情

S0:幸存1区当前使用比例 S1:幸存2区当前使用比例 E:伊甸园区使用比例 O:老年代使用比例 M:元数据区使用比例 CCS:压缩使用比例 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

jstat -printcompilation 1477 jvm编译方法统计

Compiled:最近编译方法的数量 Size:最近编译方法的字节码数量 Type:最近编译方法的编译类型。 Method:方法名标识。

最新回复(0)