type
status
date
slug
summary
tags
category
icon
password
1、概述
- jps:Java 版的 ps 命令,一般用来获取 Java 进程的 pid、查看 Java 进程的启动参数。
- jstack:查看线程堆栈信息,一般用来排查 CPU 飙升问题、程序卡顿问题、锁问题。
- jmap:查看内存信息,可以 dump 内存文件,排查内存溢出问题必备。
- jstat:周期性地打印内存使用和 GC 情况,一般用来排查 Full GC 频繁的问题。
- jinfo:查看程序的 JVM 参数。
- jcmd:相当于 jps + jstack + jmap + jinfo 命令的混合体,并提供更丰富的诊断功能,非常实用的排查问题工具
2、命令
2.1 jps
Java 版的 ps 命令,查看 Java 进程及其相关的信息,如果你想找到一个 Java 进程的 pid,那可以用 jps 命令替代 ps 命令了,简单而方便。
如果不指定 hostid 就默认为当前主机。options 说明:
-q
:显示进程 ID
-m
:显示进程 ID、JVM 启动时传给 main() 函数的参数
-l
:显示进程 ID、主类全名或 jar 路径
-v
:显示进程 ID、JVM 启动参数
常用示例
2.2 jstack
用于打印当前时刻的某个进程的线程快照(一般称为 thread dump 或者 java core 文件)。线程快照的目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。
options 说明:
-F
当正常输出的请求不被响应时,强制输出线程堆栈
-l
除堆栈外,显示关于锁的附加信息
-m
如果调用到本地方法的话,可以显示 C/C++ 的堆栈
1、打印线程堆栈信息并保存到 1.txt 文件。
2.3 jmap
可用于打印整个 JVM 内存状态。dump 出来的文件可以用 MAT、VisualVM 等工具查看。
options 说明:
-dump:[live],format=b,file=<filename>
使用 hprof 二进制形式, 输出jvm的heap内容到文件=.:live
子选项是可选的,作用是只收集说 Full GC 无法回收的对象,我们绝大部分情况下,需要的看的就是这些内存。这样会大大减少 dump 文件的大小。在使用:live
参数后,会触发 GC 操作,dump 的过程会比较慢,线上环境慎用。
-finalizerinfo
打印正等候回收的对象的信息.
-heap
打印 heap 的概要信息,GC 使用的算法、heap的配置及 wise heap的使用情况.
-histo[:live]
显示每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”,可以加上live参数
-permstat
打印 classload 和 jvm heap 持久层的信息. 包含每个classloader的名字、活泼性、地址、父 classloader 和加载的 class 数量。另外,内部 String 的数量和占用内存数也会打印出来.
-F
强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-
-h | -help
打印辅助信息
-J
传递参数给 jmap 启动的jvm。
1、生成内存快照文件,只打印存活的内存对象(这样可以减少dump文件的体积)。
2、查看当前 JVM 中所有已加载内的类创建对象的数量,占用内存等。
注意:jmap -dump:live
以及jmap -histo:live
都会触发Full GC,即使加上 JVM 参数-XX:+DisableExplicitGC
也不影响结果。在线上环境执行这两个命令需要慎重!
3、查看当前 JVM 新生、老年代和元空间的占比即使用情况。
2.4 jstat
主要用于查看 JVM 运行时状态信息, 包括内存状态、垃圾回收等。我们可能需要以下几个主要指标:
- 各内存区域大小是否合理;
- 观察 Eden 区的对象增长,如每秒有多少对象创建;
- 每次 YoungGC 后有多少对象存活下来、有多少对象进入了老年代;
- Young GC 的耗时;
- Full GC 的触发频率及耗时;
interval
是采样时间间隔,默认为 ms。count
是采样数目。options 说明:-class
:监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc
:监视 Java 堆状况,包括 Eden 区,两个 Survivor 区、老年代、永久代等的容量、已用空间、GC 合计等信息,单位为字节
-gccapacity
:监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间
-gcutil
:监视内容与 -gc 基本相同,但输出占总空间的百分比
-gccause
:与 -gcutil 功能一样, 但是会额外输出导致上一次 GC 产生原因
-gcnew
:监视新生代 GC 状况
-gcnewcapacity
:监视内容与-gcnew 相同,输出主要关注使用到的最大、最小空间
-gcold
:监视老年代 GC 状况
-gcoldcapacity
:监视内容与-gcold 基本相同,输出主要关注使用到的最大、最小空间
-gcmetacapacity
:统计元数据区域的容量信息
-compiler
:输出 JIT 器编译过的方法、耗时等信息
-printcompilation
:输出已经被 JIT 编译的方法
1、查看堆内存使用和 GC 情况,单位为字节,每 250ms 输出一次,共输出 4 次。
- S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
- EC、EU:Eden 区容量和使用量
- OC、OU:老年代容量和使用量
- MC、MU:元空间容量和使用量
- YGC、YGT:Young GC 的次数和总耗时
- FGC、FGCT:Full GC 的次数和总耗时
- GCT:GC 的总耗时
2、查看堆内存使用和 GC 情况,结果按百分比输出,每 250ms 输出一次,共输出 4 次。
- S0:新生代中 Survivor 0 区已使用空间的百分比
- S1:新生代中 Survivor 1 区已使用空间的百分比
- E:新生代已使用空间的百分比
- O:老年代已使用空间的百分比
- M:元空间已使用空间的百分比
- CCS:压缩空间已使用空间的百分比
- YGC:从应用程序启动到当前,发生Young GC 的次数
- YGCT:从应用程序启动到当前,Young GC 所用的时间,单位秒
- FGC:从应用程序启动到当前,发生 Full GC 的次数
- FGCT:从应用程序启动到当前,Full GC 所用的时间
- GCT:从应用程序启动到当前,用于 GC 的总时间,单位秒
3、查看元空间的使用情况。
Metaspace由两大部分组成:
Klass Metaspace
和 NoKlass Metaspace
。Klass Metaspace
:用来存放 klass,klass 就是 class 文件在 jvm 里的运行时数据结构。不过我们看到的类似 A.class 其实是存在 heap 里的,是java.lang.Class
的对象实例。
NoKlass Metaspace
:专门来存 klass 相关的其他的内容,比如 method,constantPool 等,可以由多块不连续的内存组成。
几个参数的意义:
used
:Java 进程实际已经使用的内存,通常 ≤ committed。
capacity
:已经分配且未释放的内存大小。
committed
:已经分配并与物理内存关联的内存空间,Java 进程可以被保证并直接使用。
reserved
:在 Java 进程虚拟地址空间中保留的内存空间,但是没有分配到物理内存中。
日志解析:
- MCMN:这个可以忽略,一般是0。
- MCMX:表示
Klass Metaspace
以及NoKlass Metaspace
两者总共 reserved 的内存大小,单位是 KB。
- MC:表示
Klass Metaspace
以及NoKlass Metaspace
两者总共 committed 的内存大小,单位是 KB。
- CCSMN:这个可以忽略,一般是0。
- CCSMX:表示
Klass Metaspace
reserved 的内存大小,单位是 KB。
- CCSC:表示
Klass Metaspace
commited 的内存大小,单位是 KB。
- YGC:Young GC 事件数。
- FGC:Full GC 事件数。
- FGCT:Full GC 总时间。
- GCT:总垃圾收集时间。
2.5 jinfo
实时查看和调整虚拟机各项参数。jinfo 可以在不重启虚拟机的情况下,可以动态的修改 JVM 的参数。尤其在线上的环境特别有用。
jinfo 使用时需要 attach 到目标 JVM 上,某些平台可能会报错
Can’t attach symbolicator to the process
,解决方案参考https://blog.csdn.net/qq_31749835/article/details/105568420options 说明:
-flag name
:显示指定名称对应的配置参数
-flags
:显示全部的配置参数
-flag <name>=<value>
:修改指定名称的参数为指定的值,针对设置 value 值的参数。
-flag [+|-]name
:启用或禁用指定名称的参数,针对 Boolean 类型的参数。
-sysprops
:显示全部的系统属性。
-h | -help
:显示帮助信息。
1、查看某个 Java 进程的所有 JVM 参数
2、查看指定的 JVM 参数
3、开启/禁用 JVM 参数
4、修改 JVM 参数
2.6 jcmd
从 JDK7 开始,jdk 提供了一个方便扩展的诊断命令 jcmd,用来取代之前比较分散的 jdk 基础命令,如 jps、jstack、jmap、jinfo 等,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间,也可以手动执行 GC、导出线程信息、堆信息等信息。
可以用先用下面命令查看 jcmd 列出当前运行的 java 进程可以执行的操作,不同的 jvm 进程 支持的操作可能是不一样的。
然后执行命令
如果想了解命令的具体用法,可以执行
2.6.1 查看进程
查看 当前机器上所有的 jvm 进程信息。
jcmd
、 jcmd -l
、 jps -lm
这三个命令作用相同2.6.2 查看堆内存信息
2.6.3 查看元空间类信息
Metaspace 在 initialize 的时候会调用 get_initialization_chunk 分配第一块 Metachunk,类加载器在类的时候是以 Metablock 为单位来使用 Metachunk。
2.6.4 查看系统中类统计信息
和
jmap -histo <pid>
的效果是一样的,可以查看每个类的实例数量和占用空间大小。2.6.5 查看线程堆栈信息
和
jstack -l
作用一样,查看线程堆栈信息。2.6.6 dump内存文件
和
jmap -dump:format=b,file=heapdump.phrof <pid>
作用一样。2.6.7 查看系统属性和VM属性
jcmd <pid> VM.system_properties
和jinfo -sysprops pid
作用一样,会输出 VM.system_properties。
jcmd <pid> VM.flags
和jinfo -flags pid
一样,会输出 VM.flags。
2.6.8 查看JVM的启动命令行
2.6.9 查看堆外内存信息
查看目标 jvm 进程的 Native Memory Tracking (NMT)信息,用于追踪 JVM 的内部内存使用。注意:打开NMT会带来5%-10%的性能损耗。
1、添加 jvm 参数
2、查看堆外内存使用情况。
reserved
:表示应用可用的内存大小,这些内存在 Java 进程虚拟地址空间中保留,但是没有分配到物理内存中。
committed
:表示应用正在使用的内存大小,这些内存已经分配并与物理内存关联,Java 进程可以被保证并直接使用
- Author:mcbilla
- URL:http://mcbilla.com/article/450a25d9-db61-4f3b-babc-7a0fc4d0c556
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts