MAT使用

一、内存导出

运行进程,用jmap导出HPROF文件。如下:
MAT使用
用jmap语句:jmap -dump:format=b.file=(文件名).hprof (进程号)

二、使用MAT查看HPROF文件视图

先用MAT打开HPROF文件会有如下视图:
MAT使用

在下方有查看Histogram,Dominator Tree,Top Consumers,Leak Suspects视图的功能。这些都可以帮助分析程序内存占用等情况。

三、OQL的使用

在上方工具栏里如下:
MAT使用

点击此按钮即可开始使用OQL进行查询。

以下为oql查询语句:
1、OQL-SELECT

1.SELECT * FROM Java.lang.String
2.SELECT toString(s), s.count, s.value FROM java.lang.String s
3.SELECT toString(s) AS Value,[email protected] AS “Shallow Size” FROM java.lang.String s
(@为属性访问器,可以使用AS起个别名 )
4.SELECT AS RETAINED SET * FROM java.lang.String
(使用AS RETAINED SET 获得与选择对象相关联的对象集合)
5.SELECT OBJECTS dominators(s) FROM java.lang.String s
( OBJECTS 关键字使得dominators 返回二维数组简化为一维对象列表 )
6.SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s
( DISTINCT 去重复 )

7、 查询所有的异常对象
SELECT * FROM INSTANCEOF java.lang.Exception exceptions
SELECT ex[email protected] , exceptions.detailMessage.toString() FROM INSTANCEOF java.lang.Exception exceptions

2、OQL-FROM

1.SELECT * FROM “java.lang…*”
(支持正则)
2.SELECT * FROM java.lang.String
3.SELECT * FROM 0xe14a100
(根据 类对象 在堆转储快照中的地址查询)
4.SELECT * FROM 3022
(根据对象在堆转储快照中的地址ID)
5.SELECT * FROM ( SELECT * FROM java.lang.Class c )
6.SELECT * FROM ${snapshot}.getClasses()
(使用属性访问器)
7.SELECT * FROM INSTANCEOF java.lang.ref.Reference
( INSTANCEOF 会把指定类的子类也查询出来)
8.SELECT * FROM OBJECTS java.lang.String
( OBJECTS 禁止OQL把查询范围解释为对象实例,上述结果为java.lang.String对应的Class)

3、OQL-WHERE

1.SELECT * FROM java.lang.String s WHERE s.count >= 100
2.SELECT * FROM java.lang.String s WHERE toString(s) LIKE “.*day”
3.SELECT * FROM java.lang.String s WHERE s.value NOT IN dominators(s)
4.SELECT * FROM java.lang.String s WHERE toString(s) = “monday”
5.SELECT * FROM java.lang.String s WHERE s.count > 100 AND [email protected] > [email protected]
6.SELECT * FROM java.lang.String s WHERE s.count > 1000 OR [email protected] >1000
7.SELECT * FROM java.lang.String s WHERE (s.count > 1000) = true
WHERE toString(s) = “monday”
WHERE dominators(s).size() = 0
WHERE s.retainedHeapSize > 1024L
WHERE [email protected] != null

如下示例:
MAT使用
circularorbit的所有对象实例

MAT使用
大于特定长度 100的 String 对象

MAT使用
大于特定大小的任意类型对象实例

MAT使用
PhysicalObject(及其子类)的对象实例的数量和总占用内存大小

MAT使用
查找包含元素数量大于100的map