Java 内存指令分析和内存泄漏的定位

目录标题

  • 前言
  • Windows环境下
  • Linux下
      • Jmap指令查看内存中对象的信息
      • 内存分析:使用MAT工具对dump文件进行分析
      • 跟踪代码,定位泄露位置

前言

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

Windows环境下

windows 环境下我们可以用JDK自带的两个工具jconsole 和jvisualvm进行简单的分析,这两个工具都在JDK的bin目录下
Java 内存指令分析和内存泄漏的定位_第1张图片
下面简单介绍一下如何使用,双击打开程序,左面会显示已经运行的Java程序,双击选中我们想要分析的程序,会在右面显示一些基础信息。
Java 内存指令分析和内存泄漏的定位_第2张图片
点击监视页签,切换到监视页面,页面上会显示CPU使用,堆和Pem内存使用,类的加载情况,线程的运行情况,这些图表信息可以清晰形象的展示程序运行的状态。然后点击堆Dump可以查看堆得使用详情。
Java 内存指令分析和内存泄漏的定位_第3张图片
其中可以看到每个类实例数量和占得百分比,内存大小等,右键还可以查看具体的实例对象信息。
Java 内存指令分析和内存泄漏的定位_第4张图片
点击线程页签可以切换到线程的页面,这里可以看到每个线程的运行情况,包括休眠、运行、等待、挂起等状态的具体情况,也可以点击线程Dump查看某一个时间点的状态
Java 内存指令分析和内存泄漏的定位_第5张图片
Java 内存指令分析和内存泄漏的定位_第6张图片
通过这些信息我们就可以简单的分析程序运行中出现的包括死锁,内存增大,内存溢出等问题,初步确定问题。

Linux下

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

  1. jmap -heap 可以查看JVM内存使用总体情况
    Java 内存指令分析和内存泄漏的定位_第7张图片
  2. jmap -histo |more 可以查看内存中每个class的实例数和占用的内存量
    jmap -histo:live |more 可以查看所有活跃的实例对象

Java 内存指令分析和内存泄漏的定位_第8张图片

  1. jmap -dump:format=b,file=dump_tomcat.dat 将内存使用情况dump到文件中
    在这里插入图片描述
    从服务器把生成的Dump文件下载到本地,准备下一步工作

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

  1. 下载MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰

富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
下载地址:http://www.eclipse.org/mat/downloads.php
然后解压,跟eclipse一样,我们直接启动就可以了,启动界面如下,我们点击左上角“file”或者红框中的“Open a Heap Dump”就可以打开我们的Dump文件。
Java 内存指令分析和内存泄漏的定位_第9张图片
Java 内存指令分析和内存泄漏的定位_第10张图片
Dump文件后缀问题,找不到Dump文件时选择All file,就可以看到了
Java 内存指令分析和内存泄漏的定位_第11张图片
2. 选择Leak Suspects Report(泄露嫌疑报告),进入到主界面,

Java 内存指令分析和内存泄漏的定位_第12张图片
3. 看到主界面,Problem区域就是提示可能有问题的类的信息了,我们可以看到,有一个类的实例占了700M左右,占用了内存总量90%以上了,点击Details可以查看详情,点击See stacktrace可以查看跟踪堆栈找到问题代码所在位置
Java 内存指令分析和内存泄漏的定位_第13张图片
4. 下图可以看出来这个对象占用了很多的内存

Java 内存指令分析和内存泄漏的定位_第14张图片

  1. 当然我们也可以切换视图,查看具体对象的一些信息,可以看到这个class生成了133w个实例,肯定是代码出问题了
    Java 内存指令分析和内存泄漏的定位_第15张图片

跟踪代码,定位泄露位置

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

Java 内存指令分析和内存泄漏的定位_第16张图片

关注公众号,每天进步一点点!
Java 内存指令分析和内存泄漏的定位_第17张图片

你可能感兴趣的:(java基础,笔记)