之前的随笔提到用jstack分析java线程情况,也是在这个项目中,当线程的问题解决之后,发现程序的内存一直增长,于是用jmap工具分析了一下java程序占用内存的情况。

命令很简单,直接

jmap -histo 22955 > jmap.info

其中22955是java的pid,重定向到jmap.info文件中,其内容为:

 num     #instances         #bytes  class name
----------------------------------------------
1: 585569 359014728 [C
2: 95905 14389200 <constMethodKlass>
3: 579358 13904592 java.lang.String
4: 95905 12287600 <methodKlass>
5: 8542 10324824 <constantPoolKlass>
6: 21015 7564272 [B
7: 8542 6355376 <instanceKlassKlass>
8: 7126 5664512 <constantPoolCacheKlass>
9: 53877 5603208 com.wisdombud.unicom.monitor.po.MessageBean
10: 117112 2810688 java.util.Date
11: 46743 2534632 [Ljava.lang.Object;
12: 3669 2142176 <methodDataKlass>
13: 25046 1850544 [Ljava.util.Hashtable$Entry;
14: 51662 1653184 java.util.Hashtable$Entry
15: 50881 1628192 java.util.concurrent.ConcurrentHashMap$HashEntry
16: 43410 1389120 java.util.HashMap$Entry
17: 55516 1332384 java.util.ArrayList
18: 24915 1195920 java.util.Hashtable
19: 8988 1162184 java.lang.Class
20: 14523 1161840 java.lang.reflect.Method
21: 21461 1030128 com.sun.org.apache.xerces.internal.dom.AttrNSImpl
22: 12866 956456 [S
23: 14959 750072 [[I
24: 5752 694480 [I
25: 9667 618688 com.sun.org.apache.xerces.internal.dom.ElementNSImpl
26: 23097 554328 com.sun.org.apache.xerces.internal.dom.ParentNode$UserDataRecord
27: 13430 537200 com.sun.org.apache.xerces.internal.dom.TextImpl
28: 5279 526192 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
29: 15795 505440 com.sun.org.apache.xerces.internal.xni.QName
30: 3120 476496 [Ljava.util.HashMap$Entry;
31: 13949 446368 com.wisdombud.unicom.collect.linux.bean.ConfLinuxFileSys
32: 23464 375424 java.lang.Object
33: 3774 366032 [Ljava.lang.String;
34: 429 233376 <objArrayKlassKlass>
35: 9685 232440 com.sun.org.apache.xerces.internal.dom.AttributeMap
36: 6981 223392 com.wisdombud.unicom.collect.linux.bean.PerfLinuxFileSys
37: 4652 223296 java.util.HashMap
38: 5279 211160 java.util.concurrent.ConcurrentHashMap$Segment
39: 5512 176384 java.util.concurrent.locks.ReentrantLock$NonfairSync
40: 243 173016 [Lcom.sun.org.apache.xerces.internal.util.SymbolTable$Entry;
41: 3159 126360 java.lang.ref.SoftReference
42: 2516 120768 com.wisdombud.unicom.collect.linux.bean.ConfLinux
43: 2761 110440 java.util.LinkedHashMap$Entry
44: 1143 100584 org.snmp4j.Snmp$PendingRequest
45: 1364 98208 org.snmp4j.mp.StateReference
46: 2352 94080 com.wisdombud.unicom.collect.linux.bean.PerfLinux Total 2225122 467913224

我去掉了很多占用比较小类。

最重要的是后两列,第三列是占用的字节数,第四列是类,关于类,解释如下:

  • [C is a char[]
  • [S is a short[]
  • [I is a int[]
  • [B is a byte[]
  • [[I is a int[][]

参考:http://stackoverflow.com/questions/7913759/what-are-these-objects-in-the-jmap-histogram

可以看到,char比较多,但也能定位到自己代码中MessageBean占用比较多,迅速定位到操作此类的方法,在通过分析代码,找到了问题的原因。

jmap可以经常用,比如每10分钟运行一次,通过对比,观察哪些类的占用内存增长比较多。

另外,jmap还有dump的参数,其方法如下:

jmap -dump:format=b,file=mem.dat 22955

在这个项目中,dump出来的文件非常大,因为网络的原因没有传过来,所以没有分析。

关于dump的用法,可以参考:http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024986.html

用jmap分析java程序的更多相关文章

  1. jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优

    转载:http://blog.csdn.net/jerry024/article/details/8507589 转载: https://blog.csdn.net/zhaozheng7758/art ...

  2. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  3. 如何利用JConsole观察分析Java程序的运行并进行排错调优_java

    如何利用JConsole观察分析Java程序的运行并进行排错调优_java 官方指导  use jconsole use jmx technology

  4. 如何利用 JConsole观察分析Java程序的运行,进行排错调优

    原文链接:http://jiajun.iteye.com/blog/810150 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  5. linux下分析Java程序内存汇总

    使用pmap查看进程内存 执行命令 使用pmap能够查看某一个进程(非java的也能够)的内存使用使用情况, 命令格式: pmap 进程id 演示样例说明 比如执行: pmap 12358 显示结果例 ...

  6. JDK自带的运行监控工具JConsole观察分析Java程序的运行

    原文地址:https://blog.csdn.net/libaolin198706231987/article/details/55057149 一.JConsole是什么 从Java 5开始 引入了 ...

  7. 如何利用JConsole观察分析JAVA程序的运行

    今天在CSDN看到一朋友说关于对JVM的研究,正好看到有关于jconsole的文章,特意找了下资料,留着备用 ps:jconsole建议用JDK1.6的1.5的界面太简陋了,另外还有增强版jvisua ...

  8. 使用JConsole观察分析Java程序的运行(转)

    一.JConsole是什么 从Java 5开始 引入了JConsole.JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.您可以轻松地使用JConsole(或者, ...

  9. linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

随机推荐

  1. 使用JAVA直观感受快速排序与冒泡排序的性能差异

    初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...

  2. android开发找不到模拟器(PANIC: Could not open:)解决办法

    android开发找不到模拟器(PANIC: Could not open:)解决办法   2013/4/3 17:44:15 0人评论 213次浏览 分类:android开发 在系统环境变量设置名为 ...

  3. R语言多重共现性的检测

    1.kappa值 2. library(car)vif(lm.sol) 得到各个系数的方差膨胀因子,当0<VIF<10的时候,不存在多重共线性,当10<=VIF<100,存在较 ...

  4. HDU 1240 (简单三维广搜) Asteroids!

    给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很 ...

  5. UVa 400 Unix Is

    题意:给出n个字符串,按照字典序排列,再按照规则输出. ===学习的紫书,题目意思很清楚,求列数和行数最开始看的时候木有看懂啊啊啊 列数:即为(60-M)/(M+2)+1;即为先将最后那一列减去,算普 ...

  6. (转)每天一个Linux命令(8): tar

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...

  7. SSH思路

    hibernate的配置写到spring的配置中,用spring管理和调用hibernate的工厂和session等.struts的话,通常有2中.一种是用spring中的一个工厂类代替struts的 ...

  8. QR二维码(转)

    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...

  9. 《Write Optimized B-Trees》读书报告

    论文原作者:Goetz Graefe, Microsoft.我读完这篇论文后颇有收获,所以写了一篇论文报告,旨在更精炼准确地阐述论文核心思想. 摘要:论文提出了一种方法,这种方法可以优化B树索引写性能 ...

  10. 计算机网络——TCP/IP协议族详解

    一.OSI七层协议体系结构域TCP/IP四层体系结构对比 ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是 ...