JVM调优——3、JVM调优命令及工具

JVM调优命令及工具

  • 写在前面的话:
  • 一、调优时基础命令
    • 1.1 Jmap (java内存信息、实例个数以及占用内存大小)
      • (1)命令: jmap -histo 2272 > ./log.txt
      • (2)命令: jmap -heap 2272
      • (3)命令: jmap ‐dump:format=b,file=xxxx.hprof 2272
    • 1.2 jatack (查线程信息)
      • (1) 命令:jstack 2272
      • (2)通过jstack命令 找出占用cpu最高的线程堆栈信息
    • 1.3 Jinfo (查jvm参数信息)
      • (1) 命令:jinfo -flags 2272
      • (2) 命令:jinfo -sysprops 2272
    • 1.4 Jstat (查gc情况)
      • (1) 命令:jstat -gc 2272
      • (2) 命令:jstat -gccapacity 2272
      • (3) 命令: jstat -gcnew 2272
      • (4) 命令:jstat -gcnewcapacity 2272
      • (5) 命令:jstat -gcold 2272
      • (6) 命令:jstat -gcoldcapacity 2272
      • (7) 命令:jstat -gcmetacapacity 2272
      • (8) 命令:jstat -gcutil 2272
  • 二、jvisualvm工具
  • 三、Arthas
    • 3.1 下载安装
    • 3.2 命令使用

写在前面的话:

本文介绍的调优命令及结果都是针对的: jdk8版本
为了方便示例,本文中 2272 指的是我java项目的进程id,也就是pid

一、调优时基础命令

这里要讲的是 java自带一些查看jvm运行状况的命令。 市面上的调优工具,底层都是用的这些命令,把这些命令输出的信息变成可视化效果更好的UI界面。

比如:我这里有个运行的java项目,通过jps命令查看到它的进程Id为2272, 以下我就用pid为2272来举例了。

1.1 Jmap (java内存信息、实例个数以及占用内存大小)

(1)命令: jmap -histo 2272 > ./log.txt

解释:查看项目的内存、实例数量信息 ,写入到这个 log.txt文件。

我们打开log.txt文件查看内容如下:
JVM调优——3、JVM调优命令及工具_第1张图片
当项目运行内存异常的时候, 我们可以通过此命令,查看代码中是哪个类它占用空间异常,从而定位修改。

(2)命令: jmap -heap 2272

解释:查看jvm的堆信息 (图中,我在每个结果后 都标记上了中文解释)。
JVM调优——3、JVM调优命令及工具_第2张图片
使用该命令,可以知道堆空间的分配、使用情况。 当我们要减少gc优化的时候,查看这些信息是非常关键且必要的。

(3)命令: jmap ‐dump:format=b,file=xxxx.hprof 2272

解释:可以把内存信息 保存成文件xxxx.hprof 。 然后用jvisualvm工具打开.hprof文件,离线查看内存情况了。 就相当于是某一刻的 内存信息的快照一样。

用jvisualvm命令工具 (jvisualvm工具的使用,下面会讲到) 导入.hprof文件后,可以查看实例数、类名、和大小,效果就相当于上面讲到的命令 jmap -histo pid 。
JVM调优——3、JVM调优命令及工具_第3张图片在工作中,如果程序发生OOM,我们希望看到它OOM前的内存信息,就可以分析是什么原因造成的OOM异常。

于是这就用到了内存信息快照的方式,在程序OOM前保存它的快照文件,然后等我们后续再打开文件分析。
我们需要添加两个配置信息,就可以 设置内存溢出自动导出dump文件:
‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPath=D:\jvm.dump
(注意 D:\jvm.dump 是我设置的文件路径。)

1.2 jatack (查线程信息)

(1) 命令:jstack 2272

解释:查看项目的线程情况 (可以通过该命令查找项目中线程死锁的情况)
JVM调优——3、JVM调优命令及工具_第4张图片

(2)通过jstack命令 找出占用cpu最高的线程堆栈信息

  1. 使用命令top -p pid ,显示你的java进程的内存情况,pid是你的java进程号,比如19663
    JVM调优——3、JVM调优命令及工具_第5张图片
    2,按H,获取每个线程的内存情况
    JVM调优——3、JVM调优命令及工具_第6张图片
    3.找到内存和cpu占用最高的线程tid,比如19664
    4,转为十六进制得到 0x4cd0,此为线程id的十六进制表示
    5,执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
    JVM调优——3、JVM调优命令及工具_第7张图片
    6,查看对应的堆栈信息找出可能存在问题的代码

1.3 Jinfo (查jvm参数信息)

(1) 命令:jinfo -flags 2272

解释:查看正在运行的Java应用程序jvm的参数。(我们在调优的时候,查看设置的jvm参数有没有生效,就可以用这个命令)
JVM调优——3、JVM调优命令及工具_第8张图片

(2) 命令:jinfo -sysprops 2272

解释:查看java系统参数
JVM调优——3、JVM调优命令及工具_第9张图片

1.4 Jstat (查gc情况)

(1) 命令:jstat -gc 2272

这个命令最常用,我们可以通过它看gc的执行次数、内存使用,等整体情况。
在这里插入图片描述参数对应的解释:

S0C:第一个幸存区的大小,单位KB
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小(元空间)
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间,单位s
FGC:老年代垃圾回收次数 
FGCT:老年代垃圾回收消耗时间,单位s
GCT:垃圾回收消耗总时间,单位s

(2) 命令:jstat -gccapacity 2272

堆内存统计
在这里插入图片描述
参数对应的解释:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数

(3) 命令: jstat -gcnew 2272

新生代垃圾回收统计
在这里插入图片描述
参数对应的解释:

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间

(4) 命令:jstat -gcnewcapacity 2272

新生代内存统计
在这里插入图片描述
参数对应的解释:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数

(5) 命令:jstat -gcold 2272

老年代垃圾回收统计
在这里插入图片描述

参数对应的解释:

MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

(6) 命令:jstat -gcoldcapacity 2272

老年代内存统计
在这里插入图片描述
参数对应的解释:

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

(7) 命令:jstat -gcmetacapacity 2272

元数据空间统计
在这里插入图片描述

参数对应的解释:

MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小 
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

(8) 命令:jstat -gcutil 2272

在这里插入图片描述

参数对应的解释:

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

二、jvisualvm工具

这是java自带的调优工具
打开cmd => 输入 jvisualvm 命令 就可以打开工具。
JVM调优——3、JVM调优命令及工具_第10张图片
在左边栏中 选择自己的java项目,查看内存信息、线程信息、gc信息
JVM调优——3、JVM调优命令及工具_第11张图片
visual GC这一栏默认是没有的,需要安装插件。 安装参考:https://blog.csdn.net/shuai825644975/article/details/78970371
JVM调优——3、JVM调优命令及工具_第12张图片

三、Arthas

Arthas 是Alibaba开源的Java诊断工具,官网地址:https://arthas.aliyun.com/doc/

3.1 下载安装

输入命令下载 arthas-boot.jar

curl -O https://arthas.aliyun.com/arthas-boot.jar 

JVM调优——3、JVM调优命令及工具_第13张图片
启动程序命令:

 Java -jar  arthas-boot.jar  

在这里插入图片描述
按数字来选择要进入哪个项目,然后按 回车。就进入程序了。
JVM调优——3、JVM调优命令及工具_第14张图片

3.2 命令使用

输入dashboard可以查看整个进程的运行情况,线程、内存、GC、运行环境信息
JVM调优——3、JVM调优命令及工具_第15张图片
还有很多命令,这里就不再列举,可以查看官方API有详细介绍。https://arthas.aliyun.com/doc/commands.html
JVM调优——3、JVM调优命令及工具_第16张图片

你可能感兴趣的:(Java,jvm,java)