zoukankan      html  css  js  c++  java
  • Java线上内存溢出问题排查步骤

    参考:

    java线上内存溢出问题排查步骤

    Java线上内存溢出问题排查步骤

    1、使用top对当前服务器内存有个大致了解top后 shift+M俺内存占用由大到小排序
    2、利用ps命令查看服务pid:ps -aux|grep java

    3、利用jstat查看虚拟机gc情况

    jstat  -gc:util <vmid>  [<interval> [<count>]
    vmid:虚拟机进程号
    interval:采样时间,默认单位是ms
    count:采样条数
    [root@speedyao java]# jstat -gcutil 17561 1000 10
     以上命令代表1秒钟采样1次,总共采样10次。
    如果FULL GC明显大于YOUNG GC次数,并且FULL GC次数很频繁,说明程序有大内存对象,并且一直无法释放。
    4、生成dump文件,有两种方式。 一种是利用jmap直接生成dump文件;另一种是利用gcore先生成core文件,再根据core文件利用jmap生成dump文件。

    (1)先说第一种,这种比较简单,使用这种方案的时候请注意:JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

     

    [root@speedyao java]# jmap -dump:format=b,file=heap.prof  17561 
    format=b:表示生成二进制类型的dump文件
    file=:后面写的是输出的dump文件路径
    17561:jvm进程id
    (2)接下来是第二种。这一种在jmap转换core文件的时候比较耗时,并且生成的dump文件用mat打开的时候分析结果不太正确,不太好定位问题。所以我建议使用第一种,虽然会造成服务挂起吧,但是结果总归是正确的。
    优势:利用gcore保存服务的内存信息,因为gcore比jmap的dump会快很多,也不对线上服务有大的影响。
    利用jmap将gcore文件转换为java的dump文件,这一步执行的比较慢,可以用nohup执行,以防止误点Ctrl+C导致退出。
    5、利用MAT或者 jdk自带的jvisualvm.exe 来分析dump文件
    在MAT工具中一般用到比较多的2个功能
    1、Histogram
    2、Leak Suspects

    Histogram

    这个功能主要是查看类和对象关系,对象和对象之间的关系,用来定位哪些对象在FGC之后还活着,哪些对象占大部分内存。

    Leak Suspects

    Leak Suspects 界面提示可能存在内存的泄露。有的时候具体代码的位置都帮我们定位好了,排查非常方便。

    JVM加上 -XX:+HeapDumpOnOutOfMemoryError 这个参数,系统oom的时候会自动dump的,到时候拿快照MAT中分析即可。
  • 相关阅读:
    数据结构——二叉树创建及遍历
    数据结构——二叉树基础
    数据结构——树
    C++拷贝构造函数
    链表C语言实现
    hrbust-oj 1937 神奇的进制转换
    UVALive 6736 Army Formation (容斥原理)
    POJ 2888 Magic Bracelet (Burnside + 矩阵加速dp)
    UVA 10601 Cubes (Burnside引理)
    UVA 11255 Necklace (BurnSide定理)
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/14158539.html
Copyright © 2011-2022 走看看