MAT(java)内存分析工具技巧

常用的功能点:

Histogram:列出内存中每个实例的数量、大小、关联对象大小(注意单位为字节)

dominator tree(支配树):在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比

with outgoing references:查看当前对象,持有的对象信息

with incoming references:查看当前对象,被哪些对象持有

Shallow Heap表示对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。

Retained Heap是该对象自己的Shallow Heap,并加上从该对象能直接或间接访问到对象的Shallow Heap之和。换句话说,Retained Heap是该对象GC之后所能回收到内存的总和。

thread overview:线程视图,展示堆内存中线程栈情况

Object Query Language (OQL) ,mat内置的对象查询语言,便于统计分析各种内存对象【注意,这里要结合对象占比、线程情况、异常类等综合判断,查询的结果也可以结合vim、excel等便于统计分析】

例:

根据线程等分析出如下的异常对象:

java.io.BufferedOutputStream    byte[]
com.mysql.jdbc.MysqlIO
com.mysql.jdbc.JDBC4Connection

OQL查询视图(F1查看语法):


100M  jdbc堆积大小
1.查看sql连接的用户
SELECT toString(s.user.value) FROM com.mysql.jdbc.JDBC4Connection s 

2.查看sql连接的语句
SELECT toString(s.buf) FROM java.io.BufferedOutputStream s 

3.查看redis.clients.jedis.Client对象的持有的对象信息   
SELECT toString(s.buf) FROM redis.clients.util.RedisOutputStream s 

SELECT toString(s.buf) FROM redis.clients.util.RedisOutputStream s WHERE (toString(s.buf).length() = 1024)

查看redis的inputstream的命中情况
SELECT toString(s.buf) FROM redis.clients.util.RedisInputStream s WHERE (toString(s.buf) LIKE "\+OK\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\..*")


3.查看redis的连接情况
SELECT s.port, toString(s.host) FROM redis.clients.jedis.HostAndPort s 


4.查看字节数组
SELECT  * FROM byte[] s
SELECT  * FROM byte[] s where toString(s).length() =1024

SELECT toString(s), s.@usedHeapSize,s.@retainedHeapSize FROM byte[] s WHERE (toString(s).length() = 1024)
 

SELECT toString(s), s.@usedHeapSize, s.@retainedHeapSize FROM byte[] s WHERE (s.@usedHeapSize = 8208)
*********21124个 8208字节    占内存160M+

发布了25 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/z390174504/article/details/103926003
今日推荐