JVM性能调试之mat
- - ITeye博客mat为eclipse的一个内存分析插件,帮助查找内存泄漏和减少内存消耗. 首先基于jmap导出的堆信息. jmap导出参见另一则博客. 执行之后用jmap输出堆信息. 我们可以看到图形化展示:. 我们可以看到有很多的User对象. 这些对象有可能会溢出,然后我们打开OQL窗口看他是否为null,执行如下OQL语句.
mat为eclipse的一个内存分析插件,帮助查找内存泄漏和减少内存消耗。
首先基于jmap导出的堆信息
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语句
SELECT u FROM org.learn.util.User u WHERE (u.value = null)
结果如下:
也就是说这个是null,但是仍然有强引用存在,gc的时候是不能回收的,这样就会出现内存的溢出问题