zoukankan      html  css  js  c++  java
  • 运维-JVM监控之内存泄漏

    转载:https://blog.csdn.net/zdx_csdn/article/details/71214219

    jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

    1、为什么会发生内存泄漏?

    如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。

    出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。

    2、内存泄漏的现象:程序中抛出OutOfMemoryError错误。

    3、发现内存泄漏的命令

        1).jstat -gc pid

        可以显示gc的信息,查看gc的次数,及时间。

        其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间

        2).jstat -gccapacity pid

        可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

        如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

        PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

        其他的可以根据这个类推, OC是old内纯的占用量。

        3).jstat -gcutil pid

        统计gc信息统计。

        4).jstat -gcnew pid

        年轻代对象的信息。

        5).jstat -gcnewcapacity pid

        年轻代对象的信息及其占用量。

        6).jstat -gcold pid

        old代对象的信息。

        7).stat -gcoldcapacity pid

        old代对象的信息及其占用量。

        8).jstat -gcpermcapacity pid

        perm对象的信息及其占用量。

        9).jstat -class pid

        显示加载class的数量,及所占空间等信息。

       10).jstat -compiler pid

        显示VM实时编译的数量等信息。

    4、常规步骤

    jstat  -gcutil pid 间隔时间(毫秒)重复次数 

    例:jstat  -gcutil 15469 3000 7

    S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
     31.25   0.00  59.34  66.31  97.84  95.21     90    1.267     1    0.548    1.815
     31.25   0.00  59.86  66.31  97.84  95.21     90    1.267     1    0.548    1.815

    FGC数量大时,有内存泄漏的问题;

    FGCT执行时间长,会导致系统的响应时间较长,若JVM的内存设置较大,那么执行一次FGC的时间可能会更长。

    FGC对服务器性能影响:发生FGC时,服务响应时间会增加,网络请求和吞吐量会下降。

    所以java内存泄漏对系统性能的影响是不可忽视的。

    5、定位内存泄漏

    获取JVM的dump文件,分析JVM堆内存内容。

    或者 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象:

    jmap -histo:live pid,

    例:jmap -histo:live 31385 | more (若分页查看 |more)

    num     #instances         #bytes  class name
    ----------------------------------------------
       1:        123359       17370656  [C
       2:         88363        9741632  [B
       3:          6771        3243432  [I
       4:        120245        2885880  java.lang.String
       5:         89176        2853632  java.util.HashMap$Node
       6:         78316        2506112  org.springframework.boot.loader.util.AsciiBytes
       7:         39154        2192624  org.springframework.boot.loader.jar.JarEntryData
       8:         50740        1623680  java.util.concurrent.ConcurrentHashMap$Node
    锁定个数最多的对象,定位问题。

    注:术语

    S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

    S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

    S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

    S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

    EC:年轻代中Eden(伊甸园)的容量 (字节)

    EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)

    OC:Old代的容量 (字节)

    OU:Old代目前已使用空间 (字节)

    PC:Perm(持久代)的容量 (字节)

    PU:Perm(持久代)目前已使用空间 (字节)

    YGC:从应用程序启动到采样时年轻代中gc次数

    YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

    FGC:从应用程序启动到采样时old代(全gc)gc次数

    FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

    GCT:从应用程序启动到采样时gc用的总时间(s)

    NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

    NGCMX:年轻代(young)的最大容量 (字节)

    NGC:年轻代(young)中当前的容量 (字节)

    OGCMN:old代中初始化(最小)的大小 (字节)

    OGCMX:old代的最大容量 (字节)

    OGC:old代当前新生成的容量 (字节)

    PGCMN:perm代中初始化(最小)的大小 (字节)

    PGCMX:perm代的最大容量 (字节)

    PGC:perm代当前新生成的容量 (字节)

    S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

    S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

    E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

    O:old代已使用的占当前容量百分比

    P:perm代已使用的占当前容量百分比

    S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

    S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

    ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

    DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

    TT:持有次数限制

    MTT :最大持有次数限制

  • 相关阅读:
    [笔记]一道C语言面试题:IPv4字符串转为UInt整数
    linux内核代码注释 赵炯 第三章引导启动程序
    bcd码
    2章 perl标量变量
    1章 perl入门
    perl第三章 列表和数组
    浮动 float
    文字与图像
    3.深入理解盒子模型
    4.盒子的浮动和定位
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/9006784.html
Copyright © 2011-2022 走看看