首页 > 编程知识 正文

jmap的常用命令,JMAPP

时间:2023-05-03 11:19:53 阅读:186490 作者:3192

jmap通常用于以下情况:

内存泄漏,在线程序运行一定时间后,内存越来越大。 它使用jmap命令弹出,分析内存中的对象信息

使用的内存比预想的要多。 这一般是编程不合理的,很多冗余对象都放在内存中。 可以使用jmap查看内存中的对象,以确定是否需要某些对象

jvm调整。 可以使用jmap查看整个堆的使用情况。 使用wwdhy世代、旧年的大小和比利,设置在各个区域。

参数

jmap -heap pid

打印堆的摘要信息,包括GC算法、堆的配置信息和使用信息。 [ root @ S10~~ ] # jmap 23045 attachingtoprocessid 23045、 please wait . errorattachingtoprocess 3360 sun.JVM.hotspot.debugger.debugger exception 3360 can ' tattachtotheprocess [ reburess ss ] jmap-heap 23045 attachingtoprocessid 23045, please wait . errorattachingtoprocess 3360 sun.JVM.hotspot.debugger.debugger exception 3360 can ' tattachtotheprocess [ reburess ss ] jmap-heap 11551 attachingtoprocessid 11551, please wait .debuggerattachedsuccessfully.servercompilerdetected.jvmversionis 24.79-b 02 usingparallelthreadsinthenewgeneregesgenereteted current mark-sweepgcheapconfiguration 3360 minheapfreeratio=40 # #堆使用率低于40%时收缩,如果Xmx=Xms,则此配置无效。 当堆使用率超过70%时,MaxHeapFreeRatio=70 ##将被扩展。 如果Xmx=Xms,则此配置无效。 max heapsize=2147483648 (2048.0 MB ) #堆的最大空间newsize=268435456(256.0MB ) ## wwdhy层代大小maxnewsize=268435456 ).0MB ) ) wdhy层代大小最大wwdhy层代大小oldsize=5439488(5.1875MB ) #旧年代大小NewRatio=2 ## wwdhy世代中Eden和Survivor区的比率为833601:1 survivor ratio=8permsize=134217728 (128.0 MB ) # 永久世代大小maxpermsize=1342177286528 ) 128.0.0MB永久世代最大内存g1heapregionsize=0(0.0MB ) #g1使用垃圾回收的区间heap usage : new gew wwdhy层代大小(将Survivor区域空间信息添加到Eden区域) capacity=241631232 ) 230.4375MB 总存储器used=20444832 ) 194.97378540039062MB ) )总存储器已用存储器free=37186400 (35.463714599609375 MB ) #剩余存储器84.610267599875 已用内存占有率Eden space : capacity=21482700865204.875 used=204360880 (194.8937225341797 MB ) free=104666128 ) 9.981277465820312031209 e 3360 capacity used=83952 (0.0800628662109375 MB ) free=26720272 ) 25.48243713789062MB ) 0.313204365953545 % used to space 3366 25.5625MB ) 0.0 % usedconcurrentxxdbm-sweep generation : # # CMS垃圾收集占用的空间信息capacity=187999

6 (5.928474426269531MB) free = 1872831736 (1786.0715255737305MB) 0.3308300461087908% usedPerm Generation: ##永久代的空间信息 capacity = 134217728 (128.0MB) used = 18828200 (17.955970764160156MB) free = 115389528 (110.04402923583984MB) 14.028102159500122% used7748 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五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。