jmap 的用途是为了展示java进程的内存映射信息,或者堆内存详情
tasklist命令查看进程id(Tasklist"是 winxp/win2003/vista/win7/win8下的命令,用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数。)
常用的参数如下:
histo
jmap -histo pid 展示class的内存情况
展示的信息为编号,实例数,字节,类名
heap
jmap -heap pid 展示pid的整体堆信息
jmap -heap 2464 JVM version is 16.3-b01 using thread-local object allocation. Parallel GC with 13 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 8436842496 (8046.0MB) NewSize = 5439488 (5.1875MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 87883776 (83.8125MB) used = 31053080 (29.614524841308594MB) free = 56830696 (54.197975158691406MB) 35.33425782706469% used From Space: capacity = 13828096 (13.1875MB) used = 196608 (0.1875MB) free = 13631488 (13.0MB) 1.4218009478672986% used To Space: capacity = 16384000 (15.625MB) used = 0 (0.0MB) free = 16384000 (15.625MB) 0.0% used PS Old Generation 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
说明如下
Parallel GC with 13 thread(s) #13个gc线程 Heap Configuration:#堆内存初始化配置 MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率 MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 MaxHeapSize = 8436842496 (8046.0MB)#-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 5439488 (5.1875MB) #-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 = 87883776 (83.8125MB) used = 31053080 (29.614524841308594MB) free = 56830696 (54.197975158691406MB) 35.33425782706469% 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
mat为eclipse的一个内存分析插件,帮助查找内存泄漏和减少内存消耗。
首先基于jmap导出的堆信息
jmap -dump:live,format=b,file=test.bin 29030
准备代码:
class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String id, String name) { super(); this.id = id; this.name = name; } }
main方法:
public static void main(String[] args) { List<User> list = new ArrayList<User>(); for (int i = 1; i < 10000; i++) { User o = new User(i + "", System.currentTimeMillis() + ""); list.add(o); o = null; } System.out.println("end"); try { Thread.sleep(100000000l); } catch (InterruptedException e) { e.printStackTrace(); } }
执行之后用jmap输出堆信息
然后导入分析工具
我们可以看到图形化展示:
然后我们点击
如下所示:
然后点击详情
我们可以看到有很多的User对象
这些对象有可能会溢出,然后我们打开OQL窗口看他是否为null,执行如下OQL语句
结果如下:
也就是说这个是null,但是仍然有强引用存在,gc的时候是不能回收的,这样就会出现内存的溢出问题
原文:http://www.cnblogs.com/duanxz/p/4890475.html