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 MetaspaceNoKlass 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/105568420
options 说明:
  • -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 进程信息。jcmdjcmd -ljps -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_propertiesjinfo -sysprops pid 作用一样,会输出 VM.system_properties。
  • jcmd <pid> VM.flagsjinfo -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 进程可以被保证并直接使用
Maven系列:打包插件大全MongoDB地理位置查询
mcbilla
mcbilla
一个普通的干饭人🍚
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉欢迎来到飙戈的博客🎉
-- 感谢您的支持 ---
👏欢迎学习交流👏