zoukankan      html  css  js  c++  java
  • JVM学习-内存监控工具(五)

    jstat

    注以下命令 后面加个毫秒数可以每多少毫秒采集一次

    类加载统计

    root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -class 10755
    
    Loaded(加载class的数量kb)  Bytes(所占用空间大小kb)  Unloaded(未加载数量kb)  Bytes(未加载占用空间kb)     Time(时间)   
     15780                      30092.6              210                282.2                         8.39

    编译统计

    [root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -compiler 10755
    Compiled(编译数量) Failed(失败数量) Invalid(不可用数量)   Time (时间)  FailedType(失败类型) FailedMethod(失败方法)
       20007              3                  0              98.91          1              com/mysql/jdbc/AbandonedConnectionCleanupThread run

    gc统计

     jstat -gc 10755 1000 #1秒采集一次
     jstat -gc 1075

     

    S0C:年轻代中 To Survivor 的容量(单位 KB);
    S1C:年轻代中 From Survivor 的容量(单位 KB);
    S0U:年轻代中 To Survivor 目前已使用空间(单位 KB);
    S1U:年轻代中 From Survivor 目前已使用空间(单位 KB);
    EC:年轻代中 Eden 的容量(单位 KB);
    EU:年轻代中 Eden 目前已使用空间(单位 KB);
    OC:Old 代的容量(单位 KB);
    OU:Old 代目前已使用空间(单位 KB);
    MC:Metaspace 的容量(单位 KB);
    MU:Metaspace 目前已使用空间(单位 KB);
    YGC:从应用程序启动到采样时年轻代中 gc 次数;
    YGCT:从应用程序启动到采样时年轻代中 gc 所用时间 (s);
    FGC:从应用程序启动到采样时 old 代(全 gc)gc 次数;
    FGCT:从应用程序启动到采样时 old 代(全 gc)gc 所用时间 (s);
    GCT:从应用程序启动到采样时 gc 用的总时间 (s)。

    堆内分配统计

    jstat -gccapacity 10755

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

    新生代gc和内存情况统计

    jstat -gcnew 10755

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

    老年代gc和内存情况统计

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

    老年代内存统计

    jstat -gcoldcapacity 10755

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

    jdk1.7永久代统计

    jstat -gcpermcapacity 19570

     

    PGCMN:最小永久代容量
    PGCMX:最大永久代容量
    PGC:当前新生成的永久代空间大小
    PC :永久代空间大小
    YGC:年轻代垃圾回收次数
    FGC:老年代垃圾回收次数
    FGCT:老年代垃圾回收消耗时间
    GCT:垃圾回收消耗总时间

    JDK8 下 元数据空间统计

     jstat -gcmetacapacity 10755

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

    内存使用百分比

    jstat -gcutil 10755

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

    jstack

    统计线程数量

    ./jstack -l 5014  | grep 'java.lang.Thread.State' | wc -l
    

     各个线程状态

    ./jstack 5014 | grep "java.lang.Thread.State" | sort -nr | uniq -c 

     

    高CPU占用排查

    用来dump线程的堆栈信息 排查死锁和高cpu代码定位

    jstack 19751|grep -A20 5295 //查找5295 并打印后20行
    jstack 19751|grep -A20 5295  >/root/threaddump.txt//查找5295 并打印后20行 并输出到指定文件
    jstack 19751  >/root/threaddump.txt// dump整个线程堆栈并输出到指定文件
    

    参考:《jvm监控-内存泄露排查》

    JMAP

    查看jvm配置以及内存信息

    1.通过ps -ef找到PID

    ps -ef|grep "程序名字"

     

    2.通过jmap打印jvm信息

    jmap -heap PID

    如果出现: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.191-b12. Target VM is 错误可能是系统装了多jdk,定位到当前jdk 指定使用binn下面的jmap

    参考《linux查看jdk安装路径》

    [root@kuaihe-test3 bin]# ./jmap -heap  19751
    Attaching to process ID 19751, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.181-b13
    #垃圾回收器信息
    using thread-local object allocation. # 指的是本地线程分配缓冲(TLAB,Thread Local Allocation Buffer)。并不是栈上分配(Stack Allocation,HotSpot暂时没有做这项优化)。
    Parallel GC with 8 thread(s) #并行 8个gc线程
    
    Heap Configuration:
       MinHeapFreeRatio         = 0 #最小堆使用比例
       MaxHeapFreeRatio         = 100 #最大堆使用比例
       MaxHeapSize              = 4164943872 (3972.0MB)  #最大堆空间大小
       NewSize                  = 87031808 (83.0MB)   #新生代分配大小
       MaxNewSize               = 1388314624 (1324.0MB) #最大新生代可分配大小
       OldSize                  = 175112192 (167.0MB)  #老年代大小
       NewRatio                 = 2  #新生代老年代比例
       SurvivorRatio            = 8  #
       MetaspaceSize            = 21807104 (20.796875MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 17592186044415 MB
       G1HeapRegionSize         = 0 (0.0MB)
    
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 742391808 (708.0MB)
       used     = 9056640 (8.6370849609375MB)
       free     = 733335168 (699.3629150390625MB)
       1.2199272543697033% used
    From Space:
       capacity = 2097152 (2.0MB)
       used     = 0 (0.0MB)
       free     = 2097152 (2.0MB)
       0.0% used
    To Space:
       capacity = 13631488 (13.0MB)
       used     = 0 (0.0MB)
       free     = 13631488 (13.0MB)
       0.0% used
    PS Old Generation
       capacity = 2776629248 (2648.0MB)
       used     = 2699893784 (2574.8193588256836MB)
       free     = 76735464 (73.1806411743164MB)
       97.23638062030527% used

    配置解读

    1: MinHeapFreeRatio=<n> 
    指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如 :-XX:MinHeapFreeRatio=30 
    2: MaxHeapFreeRatio=<n> 
    指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如 :-XX:MaxHeapFreeRatio=70 
    3:MaxHeapSize=<n> 
    最大堆内存(绝对值) 如:-Xmx100m
    4:NewSize=<n>
    设置年轻代大小(绝对值) 如-XX:NewSize=100m
    e:MaxNewSize=<n>
    年轻代最大内存(绝对值),如:-XX:MaxNewSize=100m
    5:OldSize=<n>
    设置JVM启动分配的老年代内存大小 如:-XX:OldSize=60M
    6:NewRatio=<n>
    年轻代与老年代的比例 如-XX:NewRatio=2 则 为1:2
    7:SurvivorRatio=<n>
    轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个如:-XX:SurvivorRatio=8  则eden区和2个Survivor 是8:1:1
    8:MetaspaceSize=<n>
    元空间大小元空间大小,元空间本质跟永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存。因此,元空间大小仅受本地内存限制。 如:-XX:MetaspaceSize=512m 
    9:CompressedClassSpaceSize=<n>
    作用:https://www.zhihu.com/question/268392125
    10:MaxMetaspaceSize=<n>
    元空间的最大值 每次扩容会需要产生fullgc
    
    下面分别为 年轻代 eden区 form to区,老年代的内存大小、使用内存 、可用内存。
    View Code

    dump内存信息

    jmap -dump:format=b,file=/Users/liqiang/Desktop/logs/heap.hprof  pid

    查看存活对象情况

    #只统计存活对象
    jmap -histo:live 11230 //只统计存活对象
    jmap -histo:live 11230 >/root/histo.txt //输出到指定路径

    #包含未存活对象
    jmap -histo 11230
    jmap -histo: 11230 >/root/histo.txt //输出到指定路径

     

    查看正在等待执行finalizer方法的对象

    jmap -finalizerinfo 10755//10755为PID

    说明当前F-Queue队列中并没有等待Finalizer线程执行finalizer方法的对象。

    在jvm回收时标记为垃圾对象,等待被回收时的对象

    jinfo

    jvm默认参数查看

    [root@www-pro-soa-105 ~]#jinfo -flags 13255
    Attaching to process ID 13255, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.191-b12
    Non-default VM flags: -XX:CICompilerCount=12 -XX:InitialHeapSize=5368709120 -XX:MaxHeapSize=5368709120 -XX:MaxNewSize=1789394944 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1789394944 -XX:OldSize=3579314176 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
    Command line:  -Dbiz.mark=soa.order -Xms5g -Xmx5g -XX:SurvivorRatio=8 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -javaagent:/home/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar -Darms.licenseKey=f14eehnnbd@b365dacd5848695 -Darms.appName=soa-order -Xloggc:/home/order/logs/gc.log

    查看 & 分析 GC 日志

    -XX:+PrintGC 输出GC日志
    -XX:+PrintGCDetails 输出GC的详细日志
    -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
    -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
    -Xloggc:../logs/gc.log 日志文件的输出路径

    参数配置

    -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

    gc日志

    Java HotSpot(TM) 64-Bit Server VM (25.181-b13) for bsd-amd64 JRE (1.8.0_181-b13), built on Jul  7 2018 01:02:31 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
    Memory: 4k page, physical 16777216k(474256k free)
    
    /proc/meminfo:
    
    CommandLine flags: -XX:InitialHeapSize=1048576 -XX:MaxHeapSize=1048576 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
    2020-05-12T13:44:18.823-0800: 0.066: [GC (Allocation Failure) [PSYoungGen: 512K->512K(1024K)] 512K->512K(1536K), 0.0006502 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.845-0800: 0.088: [GC (Allocation Failure) [PSYoungGen: 1024K->496K(1024K)] 1024K->528K(1536K), 0.0006331 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.857-0800: 0.100: [GC (Allocation Failure) [PSYoungGen: 1005K->512K(1024K)] 1037K->669K(1536K), 0.0005879 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.869-0800: 0.112: [GC (Allocation Failure) [PSYoungGen: 1024K->512K(1024K)] 1181K->745K(1536K), 0.0010783 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
    2020-05-12T13:44:18.880-0800: 0.123: [GC (Allocation Failure) [PSYoungGen: 1024K->512K(1024K)] 1257K->865K(1536K), 0.0011893 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.881-0800: 0.124: [Full GC (Ergonomics) [PSYoungGen: 512K->479K(1024K)] [ParOldGen: 353K->182K(512K)] 865K->661K(1536K), [Metaspace: 3189K->3189K(1056768K)], 0.0047289 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.887-0800: 0.130: [GC (Allocation Failure) --[PSYoungGen: 991K->991K(1024K)] 1173K->1501K(1536K), 0.0008886 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
    2020-05-12T13:44:18.888-0800: 0.131: [Full GC (Ergonomics) [PSYoungGen: 991K->27K(1024K)] [ParOldGen: 510K->508K(512K)] 1501K->535K(1536K), [Metaspace: 3190K->3190K(1056768K)], 0.0072092 secs] [Times: user=0.04 sys=0.00, real=0.01 secs] 
    2020-05-12T13:44:18.896-0800: 0.139: [Full GC (Ergonomics) [PSYoungGen: 490K->470K(1024K)] [ParOldGen: 508K->508K(512K)] 999K->978K(1536K), [Metaspace: 3213K->3213K(1056768K)], 0.0105437 secs] [Times: user=0.07 sys=0.00, real=0.01 secs] 
    2020-05-12T13:44:18.907-0800: 0.149: [Full GC (Allocation Failure) [PSYoungGen: 470K->470K(1024K)] [ParOldGen: 508K->499K(512K)] 978K->970K(1536K), [Metaspace: 3213K->3213K(1056768K)], 0.0097518 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
    2020-05-12T13:44:18.918-0800: 0.160: [Full GC (Ergonomics) [PSYoungGen: 512K->0K(1024K)] [ParOldGen: 509K->200K(512K)] 1021K->200K(1536K), [Metaspace: 3238K->3238K(1056768K)], 0.0038644 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
    Heap
     PSYoungGen      total 1024K, used 37K [0x00000007bfe80000, 0x00000007c0000000, 0x00000007c0000000)
      eden space 512K, 7% used [0x00000007bfe80000,0x00000007bfe89748,0x00000007bff00000)
      from space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000)
      to   space 512K, 61% used [0x00000007bff80000,0x00000007bffce4a8,0x00000007c0000000)
     ParOldGen       total 512K, used 200K [0x00000007bfe00000, 0x00000007bfe80000, 0x00000007bfe80000)
      object space 512K, 39% used [0x00000007bfe00000,0x00000007bfe322e8,0x00000007bfe80000)
     Metaspace       used 3282K, capacity 4500K, committed 4864K, reserved 1056768K
      class space    used 359K, capacity 388K, committed 512K, reserved 1048576K
    View Code

    gcviewer

    下载地址:https://sourceforge.net/projects/gcviewer/ 将日志拖到gcviewer或者使用gcviewer打开

     各个参数详解见github:https://github.com/chewiebug/GCViewer

    GCeasy

    将gc日志压缩上传https://www.gceasy.io/index.jsp

    各个代分配情况 以及最大峰值使用情况

     各个停顿时间的次数和所占百分比 以及最大停顿和平均停顿时间

     各个代回收次数 以及停顿时间统计

    报错解决

    17107: Unable to open socket file: target process not responding or HotSpot VM not loaded
    The -F option can be used when the target process is not responding

    1.切换到指定进程的用户执行命令。

    2.切换到sdk目录尝试https://www.cnblogs.com/LQBlog/p/12896443.html

  • 相关阅读:
    其他标签
    数组和全局变量
    字符串处理
    运算符
    PHP安装配置工具
    String、StringBuffer与StringBuilder之间区别
    mybits——1
    异常
    ubuntu 系统错误:Error : BrokenCount > 0解决
    ubuntu配置VScode
  • 原文地址:https://www.cnblogs.com/LQBlog/p/10691903.html
Copyright © 2011-2022 走看看