【Linux内存泄漏】自创pamp 内存快照比对定位内存泄漏【2024-11-07】
下图是用于内存分析,pamp命令抓取的两次内存快照详情:
[root@localhost ~]# pmap -X 6559 1>& 20241029_1416.log
分析内存是否有增长,主要留意三个字段,Size、Rss和Pss
- Size
• 含义:表示该内存段的总大小(以字节为单位)。
• 解释:这是分配给该内存段的总内存量,无论是否已经被实际使用。这包括代码段、数据段、堆、栈以及共享库等。
• 用途:了解进程分配了多少内存,但不一定反映了实际使用的内存量。 - RSS (Resident Set Size)
• 含义:表示该内存段当前驻留在物理内存中的大小(以字节为单位)。
• 解释:这是进程实际占用的物理内存量,包括代码段、数据段、堆、栈以及共享库等。RSS 不包括交换到磁盘上的内存。
• 用途:了解进程当前实际使用的物理内存量,是衡量进程内存使用情况的一个重要指标。 - PSS (Proportional Set Size)
• 含义:表示该内存段在物理内存中的比例大小(以字节为单位)。
• 解释:PSS 是一种更精确的内存使用度量,它考虑了共享内存的影响。对于每个共享内存段,PSS 会根据共享该段的进程数量进行分摊。例如,如果一个共享库被两个进程共享,那么每个进程的 PSS 会分摊一半的共享库大小。
• 用途:了解进程实际使用的物理内存量,特别是在多个进程共享内存的情况下,PSS 提供了更准确的度量。
如下图:SIZE = 1408 RSS = 1216 PSS = 5 ,意味这这个内存是共享内存,且共享的位置很多。因为分到这个进程的占比是 5/1408 或 5/1216。这个内存段关联的文件是libc-2.28.so,r-xp表式这个内存段是 读权限、执行权限和私有(Private)。
如下图,左侧的5间隔2天后变成右侧的6,是因为有使用这个库的进程退出,导致PSS变大。例如常用的libc库的这个PSS相比RSS会小很多。我们自己开发的so库,一般都是一样的。
综上分析,RSS分析可以得出内存是否有有效的增长。
如下图比对快照,分析结论在图上直接做了标注。
进一步的做内存分析
Gdb -a pid
dump memory /home/myb/桌面/memory_dump_0x0000629000000000.bin 0x0000629000000000 0x0000629003000000
dump memory /home/myb/桌面/memory_dump_0000632000000000.bin 0x0000632000000000 0x000063200178A000