暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java 内存指令分析和通过Dump文件定位内存泄漏的代码

小兀军 2020-05-27
2960

目录标题

    前言

    Windows环境下

    Linux下

        Jmap指令查看内存中对象的信息

        内存分析:使用MAT工具对dump文件进行分析

        跟踪代码,定位泄露位置

前言

虽然Java有很好的的内存管理,但是在进行开发的过程中,还是难免遇到内存方面的问题,例如:内存无缘无故增长,不释放;突然出现java.lang.OutOfMemoryError: Java heap space 内存溢出错误等。今天讲一下怎么对内存进行简单的分析和排查。


Windows环境下

windows 环境下我们可以用JDK自带的两个工具jconsole 和jvisualvm进行简单的分析,这两个工具都在JDK的bin目录下

下面简单介绍一下如何使用,双击打开程序,左面会显示已经运行的Java程序,双击选中我们想要分析的程序,会在右面显示一些基础信息。

点击监视页签,切换到监视页面,页面上会显示CPU使用,堆和Pem内存使用,类的加载情况,线程的运行情况,这些图表信息可以清晰形象的展示程序运行的状态。然后点击堆Dump可以查看堆的使用详情。

其中可以看到每个类实例数量和占得百分比,内存大小等,右键还可以查看具体的实例对象信息。

点击线程页签可以切换到线程的页面,这里可以看到每个线程的运行情况,包括休眠、运行、等待、挂起等状态的具体情况,也可以点击线程Dump查看某一个时间点的状态

通过这些信息我们就可以简单的分析程序运行中出现的包括死锁,内存增大,内存溢出等问题,初步确定问题。


Linux下

Jmap指令查看内存中对象的信息


jmap -heap

可以查看JVM内存使用总体情况

jmap -histo |more

可以查看内存中每个class的实例数和占用的内存量

jmap -histo:live |more

可以查看所有活跃的实例对象,同上图


jmap -dump:format=b,file=dump_tomcat.dat

将内存使用情况dump到文件中

从服务器把生成的Dump文件下载到本地,准备下一步工作

内存分析:使用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可以查看跟踪堆栈找到问题代码所在位置

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



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

跟踪代码,定位泄露位置

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



这样就成功定位问题代码位置,解决我们遇到的内存溢出问题


文章转载自小兀军,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论