用jmap分析java程序

之前的随笔提到用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

时间: 2024-11-10 13:27:45

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

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

如何利用 JConsole观察分析Java程序的运行,进行排错调优 博客分类: JAVA JavaOracleSUNEclipseJDK 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启

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

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole

linux下分析Java程序内存汇总

使用pmap查看进程内存 执行命令 使用pmap能够查看某一个进程(非java的也能够)的内存使用使用情况, 命令格式: pmap 进程id 演示样例说明 比如执行: pmap 12358 显示结果例如以下图(内容较多, 分成几张图说明): 内容開始部分 内容结束部分 上图中, 第一列.内存块起始地址 第二列.占用内存大小 第三列,内存权限 第四列.内存名称.anon表示动态分配的内存,stack表示栈内存 最后一行.占用内存总大小,请注意,此处为虚拟内存大小,占用的物理内存大小能够通过top查

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

原文地址:https://blog.csdn.net/libaolin198706231987/article/details/55057149 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从

用MAT分析JAVA程序运行时的内存使用情况

Java出现OutOfMemoryError或者发现Java应用程序占用的内存很异常,那么我们一般采用下面的步骤分析:A. 把Java应用程序使用的heap dump下来B. 使用Java heap分析工具,找出内存占用超出预期的嫌疑对象C. 根据情况,分析嫌疑对象和其他对象的引用关系.D. 分析程序的源代码,找出嫌疑对象数量过多的原因.以下面的代码为例: public class TObject { int[] arr = new int[20000]; } public class Test

简要分析Java程序的几种设计模式

今天整理了一下已学的几种JAVA设计模式,也是比较经典常用的几种. 1 单例模式singelton   项目开发中往往有这样的需求:某个对象 只需要存在一个(不用new出多个) 即保证该类有且只有一个实例 单例模式有两种实现方法 (1)饿汉式(下面通过一段代码进行解析) class Singlet{ //构造方法私有化 不允许外界再创建 private Singlet(){ } //static Singlet s = new Singlet(); private static Singlet

Linux上分析java程序的问题

通过日志看不出来的问题,可以通过看java的堆栈信息(dump文件)来看出一些端倪. 1. 找java的进程id.jdk/bin的目录 ps -ef | grep java 2. cd 到bin的目录,执行jstack命令 ./jstack [pid]    需要在catalina_yyyy-MM-dd.log里面看dump信息 ./jstack -l -F [pid]  强制打印栈信息,可以在console中看dump信息 参数: -F   当’jstack [-l] pid’没有相应的时候强

用jstack工具分析java程序

最近做项目时遇到了一个问题,我的多个采集线程中,有一个线程经常挂起,线程并没有死掉,但是一直采集不到数据,为了解决这个问题,用到了jstack. 首先查找到java进程的pid,ps -ef|grep java 然后输入jstack pid 核心输出为: "MSG_RECEIVE_THREAD" prio=10 tid=0x00007fd95034b000 nid=0x2db5 runnable [0x00007fd9d0c26000] java.lang.Thread.State:

Java 程序内存分析

转自:http://www.iteye.com/topic/528230 java程序内存主要分为了2个部分,包括stack segment(栈内存区).heap segment(堆内存区). 在分析Java程序内存分配情况时,我们从下面这个经常被使用的例子开始吧. 下面程序将打印什么呢? String s1 = new String("abc"); String s2 = new String("abc"); System.out.print(s1.equals(