1、pmap命令找出最大块内存区域

pmap [pid],找出最大块内存区域,一般即为堆内存区域

1
pmap [pid]

pmap

2、gcore产生core文件

1
$gcore [pid]

3、获取内存空间

64bit下,一个指针占8字节,5666356*1024/8=725293568
于是用gdb打印内存空间

1
2
3
4
5
$gdb [binfile] [corefile]

(gdb) set height 0
(gdb) set logging on
(gdb) x/725293568a 0x00000001249e1000

上述命令,会把内存中的内容,按照指针进行解读,保存在gdb.txt文件中。

等一会,此时gdb.txt

memory

此时gdb.txt不太好看出来类名是什么,可以用c++filt命令转换一下

1
cat gdb.txt|c++filt > demo.txt 

4、统计输出内容

根据demo.txt第五列(即类名)进行统计排序

1
cat demo.txt | awk '{print $5}'|sort|uniq -c | sort -nr | head -10

mq

此时大概率是metaq内存泄露

本文落笔于 2022-04-14