《深入理解Java虚拟机》(四) 调优工具、指令

JVM 调优的概念

调优的前提是发现问题,然后通过工具定位问题并实地分析问题,最后根据问题现象选用最合适的策略优化 / 解决 问题;JVM调优的工具很多,有jdk自带的工具,例如:jvisualvm、jconsole;也有第三方的:eclipse附带的内存分析工具MAT、专业分析gc日志的工具——GChisto等。本文主要针对如下jdk自动工具进行介绍。

jps

jps 的作用是列出系统中正在运行的虚拟机线程
命令格式:

jps [ options ] [ hostid ]

1.options 功能选项

可单个,也可多个:

2.hostid

hostid 是RMI注册表中,注册的主机名(很少用到略过)。

jstat

虚拟机统计信息监视工具
jstat 命令格式

jstat [ [ option ] vmid [ interval [s | ms] ] [ count ] ]
参数说明:

1.vmid格式

如果是本地虚拟机进程,那么它与lvmid一致,如果是远程虚拟机线程格式如下:

[protocol:][//]lvmid[@hostname[:port]/servername]

2.interval 和 count

interval 和 count 代表查询间隔时间和查询次数,如果不进行指定则默认查询一次,如下指令查询虚拟机进程15196,每隔 500毫秒打印一次共计5次;
在这里插入图片描述

3.option

option 是监视选项

  • -class class loader的行为统计
    在这里插入图片描述
    共计装载7478个类,总空间13498.5 Byte ; 卸载1个类,总空间... ;Time代表耗时

  • -compiler 输出编译器编译过的方法、耗时....
    在这里插入图片描述

  • -gc 垃圾回收堆的行为统计
    在这里插入图片描述
    C--总容量,U--已使用的容量

    S0C : survivor0区的总容量
    S1C : survivor1区的总容量
    S0U : survivor0区已使用的容量
    S1C : survivor1区已使用的容量
    EC : Eden区的总容量
    EU : Eden区已使用的容量
    OC : Old区的总容量
    OU : Old区已使用的容量
    MC : Metaspace 容量
    MC : Metaspace 已用
    YGC : 新生代垃圾回收次数
    YGCT : 新生代垃圾回收时间
    FGC : 老年代垃圾回收次数
    FGCT : 老年代垃圾回收时间
    GCT : 垃圾回收总消耗时间

  • -gccapacity 输出各个堆区域使用到的最大、最小空间
    在这里插入图片描述

    NGCMN : 新生代占用的最小空间
    NGCMX : 新生代占用的最大空间
    OGCMN : 老年代占用的最小空间
    OGCMX : 老年代占用的最大空间
    OGC: 当前年老代的容量 (KB)
    OC: 当前年老代的空间 (KB)

  • -gcutil 输出内容类似jstat -gc , -gcutil 是按照百分比输出的
    在这里插入图片描述
    S0、S1 占用为空,Eden 占用 52.18%,old--8%,Metaspace 95.25%......;young gc 5次共耗时0.027,Full GC 2次 共耗时 0.067。

  • -gccause 同-gcutil,还会输出最近两次垃圾回收事件的原因
    在这里插入图片描述

  • -gcnew 新生代行为统计
    在这里插入图片描述

    TT:Tenuring threshold(提升阈值)
    MTT:最大的tenuring threshold
    DSS:survivor区域大小 (KB)

  • -gcnewcapacity 同 -gcnew 但是它关注的是新生代各区域的边界
    在这里插入图片描述

  • -gcold 年老代和永生代行为统计
    在这里插入图片描述

  • -gcoldcapacity 同 -gcold 它关注的是边界
    gcoldcapacity

jinfo

jinfo可以实时查看和调整虚拟机参数,指令格式如下:

jinfo [ option ] pid

-flag : 输出指定args参数的值
-flags : 不需要args参数,输出所有JVM参数的值
-sysprops : 输出系统属性,等同于System.getProperties()
例如,查看进程 15196 的所有参数:

jinfo -flags 15196
在这里插入图片描述

jmap

jmap 是内存映射工具,用于生成堆转储快照,命令格式如下:

jmap [ option ] vmid

  • dump : 生成堆转储快照

    jmap -dump:live,format=b,file=D:\DUMP_FILES\dump.hprof 15196

![在这里插入图片描述]( https://img-blog.csdnimg.cn/2020100616041027.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg==,size_16,color_FFFFFF,t_70#pic_center)

jhat

jhat配合jmap使用,它可以分析jmap生成的dump快照

jhat -J-Xmx512m D:\DUMP_FILES\dump.hprof
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165308454.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165402333.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg
,size_16,color_FFFFFF,t_70#pic_center)

jstack

生成堆线程快照

-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165743832.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165810234.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg
,size_16,color_FFFFFF,t_70#pic_center)

jvisualvm

jvisualvm是图形化工具
在这里插入图片描述

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165906564.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20201006165956359.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jva2Vycg
,size_16,color_FFFFFF,t_70#pic_center)

posted @ 2021-06-19 15:16  bokerr  阅读(153)  评论(0)    收藏  举报