jmap的使用以及内存溢出分析

1、jmap的使用以及内存溢出分析

   前面经过jstat能够对jvm堆的内存进行统计分析,而jmap能够获取到更加详细的内容,如:内存使用状况的汇总、对内存溢出的定位与分析

一、查看内存使用状况

jmap -heap 29720

  

二、查看内存中对象数量及大小  

   #查看全部对象,包括活跃以及非活跃的  jmap ‐histo <pid> | more
  #查看活跃对象  jmap ‐histo:live <pid> | more
#查看活跃对象 jmap -histo:live 29720 | more
  
  对象说明:
    B byte
    C char
    D double
    F float
    I int
    J long
    Z boolean
    [ 数组,如[I表示int[]
    [L+类名 其余对象

三、将内存使用状况dump到文件中

  有些时候咱们须要将jvm当前内存中的状况dump到文件中,而后对它进行分析,jmap也是支持dump到文件中的。
#用法: jmap -dump:format=b,file=dumpFileName <pid> jmap -dump:format=b,file=../tmp/dump.dat 29720
  

   

四、经过jhat对dump文件进行分析

   咱们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时咱们能够借助于jhat工具进行查看。
#用法: jhat -port <port> <file> jhat -port 29729 ../tmp/dump.dat
   打开浏览器进行访问:http://localhost:29729/
  
  在最后面有OQL查询功能:

   

  点击下面选项:php

  

   进入页面,输入下面语句查询字符串大于10000,点击Execute按钮,查询结果:html

select s from java.lang.String s where s.value.length >= 10000

  

五、经过MAT工具对dump文件进行分析 

5.1  MAT工具介绍

  MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰 富的JAVA heap分析工具,它能够帮助咱们查找内存泄漏和减小内存消耗。使用内存分析 工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止 了垃圾收集器的回收工做,并能够经过报表直观的查看到可能形成这种结果的对象。

5.2  下载安装  

 
  

  解压后获得的文件列表:java

   

5.3  使用

  ①双击启动 MemoryAnalyzer.exe应用程序

    

  ②打开一个dump文件

     

  ③操做如图两步

    

  ④查看Overview

     

  ⑤查看Histogram

    

  ⑥查看对象以及它的依赖  dominator_tree

     

  ⑦查看可能存在内存泄露的分析

      

2、内存溢出的定位与分析 

  内存溢出在实际的生产环境中常常会遇到,好比,不断的将数据写入到一个集合中,出 现了死循环,读取超大的文件等等,均可能会形成内存溢出。
若是出现了内存溢出,首先咱们须要定位到发生内存溢出的环节,而且进行分析,是正 常仍是非正常状况,若是是正常的需求,就应该考虑加大内存的设置,若是是非正常需 求,那么就要对代码进行修改,修复这个bug。
  首先,咱们得先学会如何定位问题,而后再进行分析。如何定位问题呢,咱们须要借助 于jmap与MAT工具进行定位分析。 

一、模拟内存溢出 

   编写代码,向List集合中添加100万个字符串,每一个字符串由1000个UUID组成。若是程序可以正常执行,最后打印ok
package com.zn; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TestJvmOutOfMemory { public static void main(String[] args) { List<Object> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { String str = ""; for (int j = 0; j < 1000; j++) { str += UUID.randomUUID().toString(); } list.add(str); } System.out.println("ok"); } }

二、设置VM options参数  

-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
  

三、运行测试

  

四、当发生内存溢出时,会dump文件到java_pid65828.hprof

    

五、导入到MAT工具中进行分析

  
  能够看到,有87.99%的内存由Object[]数组占有,因此比较可疑。
  分析:这个可疑是正确的,由于已经有超过90%的内存都被它占有,这是很是有可能出 现内存溢出的。

六、查看详情 

  能够看到集合中存储了大量的uuid字符串

  

 

 

 

 

 

原文出处:https://www.cnblogs.com/Zzzzn/p/12403764.html数组

相关文章
相关标签/搜索