JVM调优使用工具01(常用命令)

2020/12/07 Jvm

JVM调优使用工具01(常用命令)

目录

JDK内置工具

1.分类

大体分为:
    1.监控类工具:jps, jstat
    2.故障排查工具:
      jinfo, jmap, jstack, jcmd,
      jhat, jhsdb
    3.可视化工具:jconsole,visualvm,jhsdb

1.监控工具

1.jps主要监控进程

参考文档:
  java 8 :https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

使用说明:
  1. 直接键入 jps  //显示java进程
  2. jps -m       //显示传入main方法参数
  3. jps -ml      //显示传入main方法参数,同时显示启动类包名
  4. jps -v       //显示传递给jvm的参数

jps 命令有点类似 ps -ef | grep java 命令,
但 jps 命令显示的格式更友好。 

jps还可以查看远程服务器的jvm进程信息,需要一些配置,使用rmi协议
        jps -l remote.domain //端口1099
        jps -l rmi://remote.comain:1231

2.jstat监控jvm各种运行状态

如同,红色框内就是列标题,很重要!

参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

使用说明:
  格式:jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

  generalOption可选参数如下:
    1.class       //显示类加载器的统计信息
    2.compiler    //显示有关jvm即时编译器行为的统计信息
    3.gc          //显示有关垃圾收集堆行为的统计信息
    4.gccause     //显示引起垃圾收集事件的原因
    ...

  outputOptions:
    1.-t           //将时间戳显示为输出的第一列
    2.-hn          //n为第几次,表示n次采样后输出一次列标题

  vmid:           //进程的唯一标识

  interval:       //间隔多长时间输出1次

  count:           //输出多少次后退出

例子:
  jstat -gc -t -h3 26000 1000 10
  每隔1000毫秒输出一次gc统计信息,输出10次退出,同时将时间戳显示为输出的第一列,每3次
  采样后输出一次列标题。
  gc列标题含义(官网上都有详细说明):
    S0C:第一个幸存区的大小
    S1C:第二个幸存区的大小
    S0U:第一个幸存区的使用大小
    S1U:第二个幸存区的使用大小
    EC:eden的大小
    EU:eden使用大小
    OC:老年代大小
    OU:老年代使用大小
    MC:方法区大小
    MU:方法区使用大小
    CCSC:压缩类空间大小
    CCSU:压缩类空间使用大小
    YGC:年轻代垃圾回收次数
    YGCT:年轻代垃圾回收消耗时间
    FGC:老年代垃圾回收次数
    FGCT:老年代垃圾回收消耗时间
    GCT:垃圾回收消耗总时间
使用jstat看G1的时候,s0永远是0:
  因为G1的堆布局跟HotSpot VM里其它GC不一样——它只有一组逻辑上的survivor space,
  而不像其它HotSpot GC一样有两段明确、固定的地址空间用作survivor space——所以用jstat
  看G1的话肯定是survivor space 0显示0%,survivor space 1显示100%。这个是正常的。

G1在初始化jstat用的计数器的时候就指定了s0永远是0:
  //  name "generation.0.space.1"  
  // See _old_space_counters for additional counters  
  // Set the arguments to indicate that this survivor space is not used.  
  _from_counters = new HSpaceCounters("s0", 1 /* ordinal */,  
  pad_capacity(0) /* max_capacity */,  
  pad_capacity(0) /* init_capacity */,  
  _young_collection_counters);  

  //  name "generation.0.space.2"  
  // See _old_space_counters for additional counters  
  _to_counters = new HSpaceCounters("s1", 2 /* ordinal */,  
  pad_capacity(overall_reserved()) /* max_capacity */,  
  pad_capacity(survivor_space_committed()) /* init_capacity */,  
  _young_collection_counters);  

来源R大帖子回复(https://hllvm-group.iteye.com/group/topic/42352)

2.故障排查工具

1.jinfo主要用来查看与调整JVM参数

可以打印系统属性和JVM参数,同时支持部分参数动态修改!

参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html

使用说明:
  jinfo [ option ] pid

  查看例如:
     1.jinfo -flags 进程id        //打印指定进程的VM参数
     2.jinfo -sysprops 进程id     //只打印系统属性
     3.jinfo -flag UseG1GC 进程id //打印UseG1GC参数的值(判断是否开启G1)
     4.jinfo -flag ThreadStackSize 进程id   //查看线程栈的指定大小
  
  动态修改参数(可以达到不重启应用改变参数):
     1.使用如下命令显示出来的参数,基本上都是支持动态修改的:
         java -XX:+PrintFlagsInitial | grep manageable
         如果显示的规则是true或者false:
            jinfo -flag +HeapDumpAfterFullGC 进程id      //+表示开,-表示关闭
         如果显示的规则是数字,则以key,value形式:
            jinfo -flag MinHeapFreeRatio=60 进程id       //修改MinHeapFreeRatio值为60

2.jmap全称Java Memory Map, 用来展示对象内存映射或堆内存详细信息

参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html

使用说明:
  jmap [options] pid

options常用选项:
  1.-clstats    //打印Java堆的类加载器统计信息

  2.-dump:dump_options:       //转存java堆
          live   //指定时,仅Dump活动对象;如果未指定,则转存堆中所有对象
          format=b: //以hprof格式Dump堆
          file=filename: //将堆Dump到filename
      例如:jmap -dump:live,format=b,file=myDump.hprof pid     //可以不指定live
            执行完命令后,可以在当前目录下找到文件,直接ll查看

  3.-finalizerinfo: //打印等待回收的对象
  4.-histo[:live]:   //打印堆的直方图,如果指定live子选项,则仅统计活动对象

扩展除了使用jmap存储堆内存,还可以:
  1.使用-XX:+HeapDumpOnOutOfMemoryError  //OOM异常后自动生成堆Dump文件
  2.使用-XX:+HeapDumpOnCtrlBreak,可以使用[Ctrl]+[Break],
    让虚拟机生成堆Dump文件。
  3.linux操作系统下,发送kill -3 pid命令

3.jstack用于打印当前虚拟机的线程快照

是对线程的Dump,也较Thread Dump

参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html

使用说明:
  jstack [-l][-e] <pid>

options:
  -l 显示有关锁的额外信息
  -e 展示有关线程的额外信息(比如分配了多少内存、定义了多少个类等等)  

例如:
   1.jstack pid   //不带任何参数,显示线程在干嘛

   2.对比,输出到指定文件
     jstack pid > t1.txt
     jstack -l pid > t2.txt //带 -l 参数会显示锁额外信息,
                            //输出这个线程所持有的锁对象
     jstack -l -e pid > t3.txt //多显示线程分配了多少内存、定义了多少个类

直接看比较类,有可视化分析jstack dump出来的结果

4.jhat用来分析jmap生成的堆Dump文件

全程JVM Heap Analysis Tool,

不太建议使用,功能比较弱。可以使用:
     1.VisualVm
     2.Eclipse Memory Analyzer
参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jhat.html

5.jcmd,用于将诊断命令发送到jvm

全程JVM Command

参考文档:
  java 8 : https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jcmd.html

很多功能类似和其它命令类似:
    1.jcmd -l 列出本机上所有jvm进程
    2.jcmd pid GC.heap_dump -all myheapdump.hprof  //类似jmap存储内存
    3.jcmd pid GC.heap_info //通知jvm做一次垃圾回收

一些好的jvm调优链接

1.G1调优官方指南必看:

http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html

2.不错的博客系列

jvm调优1-4:

https://www.cnblogs.com/chiangchou/p/jvm-1.html
https://www.cnblogs.com/chiangchou/p/jvm-2.html
https://www.cnblogs.com/chiangchou/p/jvm-3.html
https://www.cnblogs.com/chiangchou/p/jvm-4.html

Search

    Table of Contents