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

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

jps

jps全称:Java Virtual Machine Process Status Tool

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

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

例如:

shell 复制代码
jps -l

jstat

jstat全称:JVM Statistics Monitoring Tool

jstat可以查看Java程序运行时相关信息,可以通过它查看运行时堆信息的相关情况。

markdown 复制代码
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

例如:

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

shell 复制代码
jstat -gc 17351 250 4
# 进程ID 17351 ,采样间隔250ms,采样数4
markdown 复制代码
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详细信息

shell 复制代码
jstat -gcutil 17351 1s 5
# 进程ID 17351,采样间隔1s,采样数5
markdown 复制代码
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程序的扩展参数,甚至支持修改运行过程中的部分参数。

shell 复制代码
jinfo [option] <pid>

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

例子如下:

shell 复制代码
jinfo -flags 17351

jmap

jmap全称Java Memory Map

jmap用来查看堆内存使用状况,一般结合jhat使用。

no option

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

例子

shell 复制代码
jmap 17351

heap

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

例子

markdown 复制代码
jmap -heap 17351

histo[:live]

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

例子

shell 复制代码
jmap -histo:live 17351

clstats

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

dump:<dump-options>

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

例子

shell 复制代码
jmap -dump:format=b,file=heapdump.hprof 17351

jhat

jhat全称Java Heap Analysis Tool

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

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

命令为

shell 复制代码
jhat [ options] heap-dump-file

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

shell 复制代码
# 来到文件所在目录
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
markdown 复制代码
jstack [ option ] pid 查看当前时间点,指定进程的dump堆栈信息。
jstack [ option ] pid > 文件 将当前时间点的指定进程的dump堆栈信息,写入到指定文件中。
# 注:若该文件不存在,则会自动生成; 若该文件存在,则会覆盖源文件。
jstack [ option ] executable core 查看当前时间点,core文件的dump堆栈信息。
jstack [ option ] [server_id@]<remote server IP or hostname> 查看当前时间点,远程机器的dump堆栈信息。

可选参数:

markdown 复制代码
-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 打印堆栈

shell 复制代码
jstack  17351
# 或者输出到文件中查看
jstack 17351 > jvm_stack_info_17351.txt

统计线程数

shell 复制代码
jstack -l 进程id | grep 'java.lang.Thread.State' | wc -l

例子:

shell 复制代码
jstack -l 17351 | grep 'java.lang.Thread.State' | wc -l
相关推荐
xiaolingting1 小时前
Java 引用是4个字节还是8个字节?
java·jvm·引用·指针压缩
HUNAG-DA-PAO8 小时前
Spring AOP是什么
java·jvm·spring
No regret.9 小时前
JVM内存模型、垃圾回收机制及简单调优方式
java·开发语言·jvm
东阳马生架构18 小时前
JVM实战—2.JVM内存设置与对象分配流转
jvm
撸码到无法自拔19 小时前
深入理解.NET内存回收机制
jvm·.net
吴冰_hogan1 天前
JVM(Java虚拟机)的组成部分详解
java·开发语言·jvm
东阳马生架构2 天前
JVM实战—1.Java代码的运行原理
jvm
ThisIsClark2 天前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
王佑辉2 天前
【jvm】内存泄漏与内存溢出的区别
jvm
大G哥2 天前
深入理解.NET内存回收机制
jvm·.net