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

一、 Windows环境下

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

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

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

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

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

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

二、linux环境下

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

        jamp -heap pid 可以查看JVM内存使用总体情况

jmap -histo|more 可以查看内存中每个class的实例数和占用的内存量

jmap -histo:live |more 可以查看所有活跃的实例对象,同上图

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

netstat -anop|grep 端口 或者ps -ef|grep java 查询需要测试的项目的进程pid

可以使用jstat -gcutil -pid 1000 查看进程fgc情况

2、生成dump文件

使用jmap -dump:format=b,file =xxxx.dump pid

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

三、工具解析

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

下载MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。

下载地址:http://www.eclipse.org/mat/downloads.php

然后解压,跟eclipse一样,我们直接启动就可以了,启动界面如下,我们点击左上角“file”或者红框中的“Open a Heap Dump”就可以打开我们的Dump文件。

2、打开dump文件

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

3、.选择Leak Suspects Report(泄露嫌疑报告)

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

4、点击详情链接

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值