一.分析背景

在服务器上运行java项目服务时,由于服务所实现的功能导致每个项目在消耗服务器系统内存上有所差异。如果在项目中某个功能模块中作了不良好的操作导致占用的资源未能及时释放就会导致内存泄露,服务无法运行。为了排查这个问题,除了人工检查代码外,还可以通过外部工具锁定问题代码的位置。

二.解决问题

命令

使用命令 jmap ——JDK自带的内存占用检测工具
例如以下命令是输出指定java服务占用内存排名前20的类 :

jmap -histo 服务进程号 | head -20

JAVA 内存分析 数据类型 java内存分析命令_内存分析


但是无法具体分析具体代码内容。如果想要具体的分析则需要将服务器上指定项目的堆转储文件获取下来,在使用分析工具进行分析这里使用的是MAT(Memory Analyse Tool)。

使用jamp命令:

jmap -dump:format=b,file=dump.hprof(文件名) 服务进程号

将堆转储文件生成至当前目录然后再下载到本地。

工具

下载链接 在eclipse也可以作为插件使用,但是要导入对存储文件则需要单独作为软件使用。因为我们要在自己电脑上打开从服务器下载的堆转储文件。所以选择windos版本的下载。下载后直接解压如图:

JAVA 内存分析 数据类型 java内存分析命令_java_02


直接双击MemoryAnalyzer就可以打开工具(必要的话可以修改下配置文件MemoryAnalyzer.ini,修改里面的参数如-Xmx5120m(最好要大于你的堆转储文件))。

分析

使用工具打开转储文件,最好将文件单独放在一个文件夹再打开。因为解析文件的过程会在打开的目录下产生其他额外文件。同时会在堆转储文件的同级目录下生成一个压缩文件filename_Leak_Suspects.zip,里面是一个html静态页面,我们也可以在浏览器去分析。

选择 ‘Leak Suspects’ 会显示MAT它自己认为有问题的内容。

分析结果:

JAVA 内存分析 数据类型 java内存分析命令_项目维护_03


JAVA 内存分析 数据类型 java内存分析命令_JAVA 内存分析 数据类型_04


如果显示的可能出现内存泄漏中有你写的代码对应的类,就可以定位,一层一层找出问题。