zoukankan      html  css  js  c++  java
  • java 内存爆满排查命令

        要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多.

    1. top 一下获取内存占用率最高的pid。

    2. 转到 jdk的bin目录,执行jdk命令。

    一. jstat

     (1)./jstat  -gc pid 查看gc的次数,及时间。最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

     jstat -gc pid [interval] 命令查看了 Java 进程的 GC 状态,果然,FULL GC 达到了每秒一次

     这么多的 FULL GC,应该是内存泄漏没跑了,于是使用 jstack pid > jstack.log 保存了线程栈的现场。

    使用 jmap -dump:format=b,file=heap.log pid 保存了堆现场,然后重启了探测服务,报警邮件终于停止了。

        (2)./jstat -gcutil pid  统计gc信息统计

    二. jmap

    (1)./jmap -heap pid  查看JVM空间总体使用情况

    (2)./jmap -histo  pid |more  查看类的实例数和内存量

    (3)./jmap -histo:live pid |more 查看所有活着的实例数量。

    (4)./jmap -dump:format=b,file=dump_tomcat.dat pid 将内存使用情况dump到文件中

    3. 使用MAT工具对dump文件进行分析。

    下载MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰
    富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
    下载地址:http://www.eclipse.org/mat/downloads.php
    然后解压,跟eclipse一样,我们直接启动就可以了,启动界面如下,我们点击左上角“file”或者红框中的“Open a Heap Dump”就可以打开我们的Dump文件。

     

     Dump文件后缀问题,找不到Dump文件时选择All file,就可以看到了

     2. 选择Leak Suspects Report(泄露嫌疑报告),进入到主界面

     3. 看到主界面,Problem区域就是提示可能有问题的类的信息了,我们可以看到,有一个类的实例占了700M左右,占用了内存总量90%以上了,点击Details可以查看详情,点击See stacktrace可以查看跟踪堆栈找到问题代码所在位置。

     其中深蓝色的部分就为内存泄漏的部分,java的堆内存一共只有717.8 M而内存泄漏的部分独自占有了72.8 M所以本次的内存泄漏很明显。

     4. 下图可以看出来这个对象占用了很多的内存

     当然我们也可以切换视图,查看具体对象的一些信息,可以看到这个class生成了133w个实例,肯定是代码出问题了

    跟踪代码,定位泄露位置

    点击See stacktrace,下图是跟踪的代码位置,可以清晰的看到是第几行生成的对象,进而分析代码

     

     

  • 相关阅读:
    Scratch编程:打猎(十)
    Scratch编程:漂亮的时钟(九)
    剑指offer总结一:字符、数字重复问题
    剑指offer:数值的整数次方
    剑指offer:二进制中1的个数
    InnoDB存储引擎与MyIsam存储引擎的区别
    数据库查询慢的原因
    剑指offer:矩形覆盖
    剑指offer:跳台阶问题
    redis键的过期和内存淘汰策略
  • 原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/15701817.html
Copyright © 2011-2022 走看看