jmap详解

jmap一般使用于以下的几种情况:

内存泄漏,线上程序在运行一段时间之后内存越来越大,这是我们要使用jmap命令dump出,内存的对象信息,然后进行分析
内存使用大于预期,这个一般是程序设计不合理,有很多冗余的对象放置在内存中,可以使用jmap查看内存中的对象,看看有些对象是否必要
jvm调优,可以使用jmap查看整个堆的使用情况。根据新生代,老年代的大小和使用比利,来对各个区域进行设置。

参数

  • jmap -heap pid
    打印堆的摘要信息,包括GC算法,堆的配置信息和使用信息,如下:
[root@S10 ~]# jmap 23045
Attaching to process ID 23045, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
[root@S10 ~]# jmap -heap 23045
Attaching to process ID 23045, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
[root@S10 ~]# jmap -heap 11551
Attaching to process ID 11551, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40 ##在堆的使用率小于40%的时候进行收缩,当Xmx=Xms的时候此配置无效
   MaxHeapFreeRatio = 70  ##在堆使用率大于70%的时候进行扩展,当Xmx=Xms的时候此配置无效
   MaxHeapSize      = 2147483648 (2048.0MB)  ##堆的最大空间
   NewSize          = 268435456 (256.0MB) ##新生代的大小
   MaxNewSize       = 268435456 (256.0MB) ##最大的新生代的大小
   OldSize          = 5439488 (5.1875MB) ##老年代的大小
   NewRatio         = 2  ##新生代中Eden和和Survivor区的比例为 8:1:1
   SurvivorRatio    = 8
   PermSize         = 134217728 (128.0MB) ##永久代的大小
   MaxPermSize      = 134217728 (128.0MB) ##永久代的最大内存
   G1HeapRegionSize = 0 (0.0MB) ##使用G1垃圾收集的区间

Heap Usage:
New Generation (Eden + 1 Survivor Space): ##新生代的大小(Eden区加一个Survivor区的空间信息)
   capacity = 241631232 (230.4375MB) ##总内存
   used     = 204444832 (194.97378540039062MB) ##已使用内存
   free     = 37186400 (35.463714599609375MB)  ##剩余内存
   84.61026759984405% used  ## 使用内存占比
Eden Space:
   capacity = 214827008 (204.875MB)
   used     = 204360880 (194.8937225341797MB)
   free     = 10466128 (9.981277465820312MB)
   95.1281135005148% used
From Space:
   capacity = 26804224 (25.5625MB)
   used     = 83952 (0.0800628662109375MB)
   free     = 26720272 (25.482437133789062MB)
   0.3132043665953545% used
To Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation: ##CMS垃圾收集占用的空间信息
   capacity = 1879048192 (1792.0MB)
   used     = 6216456 (5.928474426269531MB)
   free     = 1872831736 (1786.0715255737305MB)
   0.3308300461087908% used
Perm Generation:  ##永久代的空间信息
   capacity = 134217728 (128.0MB)
   used     = 18828200 (17.955970764160156MB)
   free     = 115389528 (110.04402923583984MB)
   14.028102159500122% used

7748 interned Strings occupying 611400 bytes.
  • jmap -histo pid
    按照类进行归纳,该命令会统计Java进程内每个类的对象个数之和,和该类所有对象的占用的空间之和,以及类名称。注意:
    1 该命令在线上执行的时候要做好评估,否则会导致线上机器宕机。
    2 jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。
[root@S10 ~]# jmap -histo 14247 | more

 num     #instances         #bytes  class name
----------------------------------------------
   1:         46252        6767776  <constMethodKlass>
   2:         46252        5929280  <methodKlass>
   3:           227        5511208  [I
   4:          4244        4827320  <constantPoolKlass>
   5:          4244        3042808  <instanceKlassKlass>
   6:          3540        2726656  <constantPoolCacheKlass>
   7:         24163        2246872  [C
   8:          7768        1026128  [B
   9:         23229         557496  java.lang.String
  10:           792         460192  <methodDataKlass>
  11:          4598         443696  java.lang.Class
  12:          6059         363560  [S
  13:          6947         362112  [[I
  14:          3893         311440  java.lang.reflect.Method
  15:           337         183328  <objArrayKlassKlass>
  16:          5301         169632  java.util.HashMap$Entry
  17:          5154         164928  java.util.concurrent.ConcurrentHashMap$HashEntry
  18:          2839         134208  [Ljava.lang.Object;
  19:          2886         115440  java.util.LinkedHashMap$Entry
  20:           930         103496  [Ljava.util.HashMap$Entry;
  21:          3216         102912  java.lang.ref.WeakReference
  22:          1883          75320  java.lang.ref.SoftReference
  23:          4353          69648  java.lang.Object
  24:          1085          64080  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
  25:           854          61488  java.lang.reflect.Field
  26:          2711          58464  [Ljava.lang.Class;
  27:          2137          51288  java.util.ArrayList
  28:          1934          46416  java.beans.MethodRef
  29:          1085          43400  java.util.concurrent.ConcurrentHashMap$Segment
  30:           762          42672  java.beans.MethodDescriptor
  31:           757          42392  java.util.LinkedHashMap


##############解释##############
instances : 对象个数
bytes : 占用字节
class name : 类
  • jmap -dump
    命令主要是用来dump Java进程的堆内容

执行下面这个命令会在当前目录生成test 文件(内存二进制文件)

[root@S10 ~]# jmap -F -dump:format=b,file=test 14247

执行如下的命令,分析dump出来二进制内存文件,并启动一个webserver。

jhat test

浏览器输入: http://172.16.0.10:7000/

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值