JDK 1.7+(jcmd命令从JDK 1.7以后支持)
JVM进程的pid(Linux环境可以通过ps -ef获取)
必须进入指定jdk的bin目录下包含jps、jstat等等,然后再输命令,否则命令无效
https://www.cnblogs.com/ostenant/p/9696226.html
1. jcmd命令介绍 --- 显示进程内存信息
1.1 查看进程
命令:jcmd -l
作用:查看环境上所有JVM进程的信息(云化环境JVM进程较多,建议直接使用ps -ef | grep "微服务名称"查询比较方便)
1.2 列出当前JVM进程支持的命令(最最最实用的命令)
命令:jcmd pid help
作用:列出当前运行的 java 进程可以执行的操作
1.3 打印堆内存
命令:jcmd pid GC.heap_dump dump.bin(云化环境打印在微服务的根目录下)
作用:打印堆内存到文件
1.4 打印堆栈信息
方法一:欧拉操作系统,使用ossuser执行 kill -3 pid。堆栈信息打印在各服务tomcat的catalina.out文件中。
致谢:多谢超哥00267207提供方法及输出文件路径。
方法二:命令:jcmd pid Thread.print (内容较多,建议输出到文件, jcmd pid Thread.print > thread.log)
作用:打印堆栈信息
更多细节:https://www.jianshu.com/p/388e35d8a09b
2.jstat命令介绍 --- 显示垃圾回收信息
jstat是用于识别虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据,它是线上定位jvm性能的首选工具。
jstat工具提供如下的jvm监控功能:
1)类的加载及卸载的情况;
2)查看新生代、老生代及元空间(MetaSpace)的容量及使用情况;
3)查看新生代、老生代及元空间(MetaSpace)的垃圾回收情况,包括垃圾回收的次数,垃圾回收所占用的时间;
4)查看新生代中Eden区及Survior区中容量及分配情况等。
2.1 查看gc信息
命令:jstat -gc pid
作用:显示gc的信息,查看gc的次数,及时间
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:从应用程序启动到采样时young gc的次数
YGCT:从应用程序启动到采样时young gc的所用的时间(s)
FGC:从应用程序启动到采样时full gc的次数
FGCT:从应用程序启动到采样时full gc的所用的时间(s)
GCT: 从应用程序启动到采样时整个gc所用的时间
./jstat -gc 426 1000 10
每隔1秒更新出最新的一行jstat统计信息,一共执行10次jstat统计。
通过这个命令,可以非常灵活的对线上机器通过固定频率输出统计信息,观察每隔一段时间的JVM中的Eden区对象占用变化。比如执行完这个命令之后,第一秒先显示出Eden区使用了200MB内存,第二秒显示出来Eden区使用了205MB内存,第三秒显示Eden区使用了209MB内存,以此推出这个系统大概每秒新增5MB左右的对象。
2.2 gc信息统计
命令:jstat -gcutil pid
作用:获取gc的统计数据
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
实操:jstat -gcutil pid 3s (每3s打印一次gcutil)
表示监控进程11900的GC情况,每3秒输出一条记录,从这里可以看到O列一直100%,FGC列一直增长。这种场景表示FullGC后,堆内存一直没法释放。一旦出现这种情况,基本上十有八九就是内存泄漏。
要点:O列(老生代内存使用率)一直接近100%,FGC列(FullGC次数)一直增长
致谢:多谢超哥 00267207提供实际案例。
更多细节:
https://apppukyptrl1086.pc.xiaoe-tech.com/detail/i_5d11e6b3c5c6a_K6Xk3Bs1/1
https://blog.csdn.net/zhaozheng7758/article/details/8623549
3:jps使用 ---主要查看进程JVM配置信息
jps是用于查看有权访问的hotspot虚拟机的进程。当未指定hostid时,默认查看本机jvm进程,否则查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。
jps可以列出jvm进程lvmid,主类类名,main函数参数,jvm参数,jar名称等信息。
命令:./jsp -l ---输出进程号,jar包
命令:./jps -v ---输出进程启动时jvm参数配置
命令:./jps -m ---输出进程启动依赖的配置参数
更多细节:https://blog.csdn.net/wo541075754/article/details/55095443
4:jinfo --查看和调整jvm各项参数
jinfo(JVM Configuration info)这个命令作用是实时查看和调整 虚拟机运行参数。之前的 jps -v 命令只能查看到显示 指定的参数,如果想要查看 未显示 的参数的值就要使用 jinfo 命令。
jinfo [option] pid
选项
option具体选项及作用如下:
-flags 查看jvm的参数
-sysprops 查看java系统参数
-flag [+|-] 修改正在运行的Java应用程序JVM参数,其中+是开启对应参数,-是关闭对应参数
命令:./jinfo 655
命令:./jinfo -flags 655 查看jvm参数
命令:./jinfo -flag <name> pid
命令:./jinfo -flag < name > = < value > 修改指定name的jvm参数值
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306
-XX:CMSAbortablePrecleanWaitMillis=100
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis=50 4306
[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306
-XX:CMSAbortablePrecleanWaitMillis=50
查看可修改的JVM参数:
命令:java -XX:+PrintFlagsInitial | grep manageable
命令:./jinfo -flag [+|-] 关闭PrintGCDetails参数
更多细节:https://blog.csdn.net/qq2430/article/details/82154442
5.jmap --- 内存映射工具
jmap(JVM Memory Map) 命令用来查看堆内存使用状况,一般结合jhat使用,用于生成heap dump文件。jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和元空间metaspace的详细信息,如当前使用率、当前使用的是哪种收集器等等。
如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候,自动生成dump文件。
命令:./jmap -dump:format=b,file=./gate.dump 9625
dump用于导出内存转储快照。常用的方式是通过jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump的命令格式如jmap -dump:format=b,file=dumpFileName,导出的 dump 文件可以通过 MAT、VisualVM 和 jhat 等工具查看分析:
命令:./jmap -finalizerinfo 9625
命令:./jmap -heap 9625
显示 堆 中的摘要信息。包括 堆内存 的使用情况,正在使用的 GC 算法、堆配置参数 和 各代中堆内存 使用情况。可以用此来判断内存目前的 使用情况 以及 垃圾回收 情况。
命令:./jmap -histo 9625
打印堆的 对象统计,包括 对象实例数、内存大小 等等。因为在 histo:live 前会进行 full gc,如果带上 live 则只统计 活对象。不加 live 的堆大小要大于加 live 堆的大小。
更多细节:https://blog.csdn.net/zhaozheng7758/article/details/8623530
6.jstack --- 进程中的堆栈跟踪
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等等。
线程出现停顿的时候,通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以通过core文件获取java stack和native stack的信息,从而定位程序崩溃的原因。
命令:./jstack -F 9625 --强制输出线程堆栈
命令:./jstack -l 655 --显示堆栈和锁
命令:./jstack -m 9625 --可以显示本地c++堆栈
更多细节:https://blog.csdn.net/zhaozheng7758/article/details/8623535