利用JDK自带工具分析JVM使用情况

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    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

你可能感兴趣的:(利用JDK自带工具分析JVM使用情况)