上篇学习笔记用mat分析dump,就是用jmap命令生成的。所以借这个机会整理下jmap常用命令
背景:j
ava dump是Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。
线程Dump,包含所有线程的运行状态。纯文本格式。
堆Dump,包含线程Dump,幵包含所有堆对象的状态。二进制格式。
jmap 的用途是为了展示java进程的内存映射信息,或者堆内存详情。
常用的参数如下:
-histo
测试了下,报错:
jmap histo 8423
Attaching to core 8423 from executable histo, please wait...
Error attaching to core file: Can't attach to the core file
为啥呢?自己还想为啥呢?难道记错命令了:原来是少加了-,手一哆嗦就犯错了。
打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-finalizerinfo 打印正等候回收的对象的信息
-heap
下面是参数说明:
Heap Configuration:#堆内存初始化配置
MinHeapFreeRatio = 0 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率
MaxHeapFreeRatio = 100 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率
MaxHeapSize = (8000.0MB)#-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = (1.25MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 17592186044415 MB #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 5439488 (5.1875MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小
NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 21757952 (20.75MB) #-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
MaxPermSize = 88080384 (84.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
Heap Usage:
PS Young Generation
Eden Space:#Eden区内存分布
capacity = (300MB) 容量
used = (252MB) 已使用
free = (47MB) 空闲
使用率% used
From Space:#其中一个Survivor区的内存分布
capacity = 13828096 (13.1875MB)
used = 196608 (0.1875MB)
free = 13631488 (13.0MB)
1.4218009478672986% used
To Space:#另一个Survivor区的内存分布
capacity = 16384000 (15.625MB)
used = 0 (0.0MB)
free = 16384000 (15.625MB)
0.0% used
PS Old Generation#当前的Old区内存分布
capacity = 156172288 (148.9375MB)
used = 27098208 (25.842864990234375MB)
free = 129074080 (123.09463500976562MB)
17.35148299805917% used
PS Perm Generation#当前的 “永生代” 内存分布
capacity = 88080384 (84.0MB)
used = 50847592 (48.492042541503906MB)
free = 37232792 (35.507957458496094MB)
57.728622073218936% used
MinHeapFreeRatio = 0 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率
MaxHeapFreeRatio = 100 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率
MaxHeapSize = (8000.0MB)#-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = (1.25MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 17592186044415 MB #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 5439488 (5.1875MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小
NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 21757952 (20.75MB) #-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
MaxPermSize = 88080384 (84.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
Heap Usage:
PS Young Generation
Eden Space:#Eden区内存分布
capacity = (300MB) 容量
used = (252MB) 已使用
free = (47MB) 空闲
使用率% used
From Space:#其中一个Survivor区的内存分布
capacity = 13828096 (13.1875MB)
used = 196608 (0.1875MB)
free = 13631488 (13.0MB)
1.4218009478672986% used
To Space:#另一个Survivor区的内存分布
capacity = 16384000 (15.625MB)
used = 0 (0.0MB)
free = 16384000 (15.625MB)
0.0% used
PS Old Generation#当前的Old区内存分布
capacity = 156172288 (148.9375MB)
used = 27098208 (25.842864990234375MB)
free = 129074080 (123.09463500976562MB)
17.35148299805917% used
PS Perm Generation#当前的 “永生代” 内存分布
capacity = 88080384 (84.0MB)
used = 50847592 (48.492042541503906MB)
free = 37232792 (35.507957458496094MB)
57.728622073218936% used
-permstat
打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-dump
将内存使用的详细情况输出到文件,执行命令:
导出的dump文件可以使用mat分析。见上一篇学习笔记。
jmap -dump:format=b,file=heapDump 6900
*********************************************************
总结:
1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
2.
使用
jmap -histo:[live]
查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
3.针对内存泄漏,可以dump多次内存。可以使用mat进行对比,查找差异,便于查找问题。
参照文章:
http://www.importnew.com/18176.html