JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用

jps

jps全称:Java Virtual Machine Process Status Tool

可以查看Java进程,相当于Linux下的ps命令,只不过它只列出Java进程。

jps:列出Jav程序ID和Main函数名称
jps -q:只输出进程ID
jps -m :输出传递给Java进程(主函数)的参数
jps -l:输出主函数的完整路径
jps -v:显示传递给Java虚拟的参数

例如:

jps -l

测试

jstat

jstat全称:JVM Statistics Monitoring Tool
jstat可以查看Java程序运行时相关信息,可以通过它查看运行时堆信息的相关情况。

jstat -<options> [-t] [-h<lines>] <vmid> [<interva1>I count>]]
options:由以下值构成
-class:显示C1assLoader的相关信息
-compiler:显示了JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause.显示垃圾收集相关信息〈同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息 
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息

找到进程id

找到进程id

例如:

下面输出的是进程内存区域及GC详细信息

jstat -gc 17351 250 4
# 进程ID 17351 ,采样间隔250ms,采样数4

例子

s0C:年轻代中第一个survivor(幸存区)的容量(单位kb)
s1C:年轻代中第二个survivor(幸存区)的容量(单位kb)
s0u :年轻代中第一个survivor(幸存区)目前已使用空间(单位kb)
s1U :年轻代中第二个survivor(幸存区)目前已使用空间(单位kb)
EC :年轻代中Eden的容量(单位kb)
EU :年轻代中Eden目前己使用空间(单位kb)
oC : old代的容量(单位kb)
ou : old代目前已使用空间(单位kb)
MC: metaspace的容量(单位kb)
MU: metaspace目前已使用空间(单位kb)
ccsc:压缩类空间大小
ccsu:压缩类空间使用大小
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时o1d代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

例子2:

下面输出的是进程内存区域百分百 及 GC详细信息

jstat -gcutil 17351 1s 5
# 进程ID 17351,采样间隔1s,采样数5

截图

s0:年轻代中第一个survivor(幸存区)己使用的占当前容量百分比
s1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
M:metaspace已使用的占当前容量百分比
ccs压缩使用比例
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时o1d代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

jinfo

jinfo全称Java Configuration Info
jinfo可以用来查看正在运行的Java程序的扩展参数,甚至支持修改运行过程中的部分参数。

jinfo [option] <pid>

-flags 打印虚拟机 VM 参数
-flag <name> 打印指定虚拟机 VM 参数
-flag [+|-]<name> 打开或关闭虚拟机参数
-flag <name>=<value> 设置指定虚拟机参数的值

例子如下:

jinfo -flags 17351

截图

jmap

jmap全称Java Memory Map
jmap用来查看堆内存使用状况,一般结合jhat使用。

no option

命令:jmap pid
描述:查看进程的内存映像信息。使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的
起始地址、映射大小以及共享对象文件的路径全称。

例子

jmap 17351

截图

heap

命令:jmap -heap pid
描述:显示Java堆详细信息:打印堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

例子

jmap -heap 17351

截图

histo[:live]

命令:jmap -histo:live pid
描述:显示堆中对象的统计信息:其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

例子

jmap -histo:live 17351

截图

clstats

命令:jmap -clstats pid
描述:打印类加载器信息:打印Java堆内存的方法区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、
地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

dump:<dump-options>

命令: jmap -dump:format=b,file=heapdump.hprof pid
描述:生成堆转储快照dump文件:以二进制格式转储Java堆到指定文件中。如果指定了live子选项,堆中只有活动的对象会被转
储。浏览heap dump 可以使用jhat 读取生成的文件,也可以使用MAT等堆内存分析工具。
注意:这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执
行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用!

例子

jmap -dump:format=b,file=heapdump.hprof 17351

截图

jhat

jhat全称Java Heap Analysis Tool

jhat 命令会解析Java堆转储文件,并启动一个 web server。然后用浏览器来查看/浏览 dump 出来的 heap二进制文件。
jhat 命令支持预先设计的查询,比如:显示某个类的所有实例。还支持 对象查询语言(OQL)。 OQL有点类似SQL,专门用来
查询堆转储。

Java生成堆转储的方式有多种:
1. 使用 jmap -dump 选项可以在JVM运行时获取 dump.
2. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储。
3. 在虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项,则抛出 OutOfMemoryError 时,会自动执行堆转
储。

命令为

jhat [ options] heap-dump-file

我们分析,刚才生成的heapdump.hprof文件

# 来到文件所在目录
jhat  ./heapdump.hprof

截图

会暴露一个7000端口;在浏览器查看

截图

jstack

jstack全称Java Stack Trace

jstack是Java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。

线程快照是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待、等等。

线程快照里留意下面几种状态

  • 死锁,Deadlock(重点关注)
  • jhat [ options 1 ] heap-dump-file
  • 等待资源,Waiting on condition(重点关注)
  • 等待获取管程,Waiting on monitor entry(重点关注)
  • 阻塞,Blocked(重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait() 或 TIMED_WAITING
  • 停止,Parked
jstack [ option ] pid 查看当前时间点,指定进程的dump堆栈信息。
jstack [ option ] pid > 文件 将当前时间点的指定进程的dump堆栈信息,写入到指定文件中。
# 注:若该文件不存在,则会自动生成; 若该文件存在,则会覆盖源文件。
jstack [ option ] executable core 查看当前时间点,core文件的dump堆栈信息。
jstack [ option ] [server_id@]<remote server IP or hostname> 查看当前时间点,远程机器的dump堆栈信息。

可选参数:

-F # 当进程挂起了,此时'jstack [-l] pid'是没有相应的,这时候可使用此参数来强制打印堆栈信息,强制jstack),一般情况不
需要使用。
-m # 打印java和native c/c++框架的所有栈信息。可以打印JVM的堆栈,以及Native的栈帧,一般应用排查不需要使用。
-l # 长列表. 打印关于锁的附加信息。例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久
得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需
要使用。
-h or -hel # 打印帮助信息

jstack pid 打印堆栈

jstack  17351
# 或者输出到文件中查看
jstack 17351 > jvm_stack_info_17351.txt

统计线程数

jstack -l 进程id | grep 'java.lang.Thread.State' | wc -l

例子:

jstack -l 17351 | grep 'java.lang.Thread.State' | wc -l

截图

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随机的未知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值