内存泄漏定位思路和方法

本文介绍了在Linux系统下定位内存泄漏问题的步骤,包括查看内存概况、检查/tmp目录、分析进程内存占用、查看meminfo信息以及检查隐形内存占用。通过`free`、`ps`、`cat /proc/meminfo`等命令,结合slabinfo和vmallocinfo,能有效排查内存泄漏。特别提到了socket收发包队列积压可能导致的隐形内存占用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存泄漏定位思路和方法

本文主要针对基于Linux操作系统,提供了一种通用的内存泄漏定位分析思路和方法。

1. 查看内存概况
[root@centos ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1883844      376664       76136         192     1431044     1311252
Swap:       1048572       30540     1018032

通过free命令,我们对内存的整体使用有个初步了解,并快速是否存在内存泄漏可能。

1.1 used占用正常
used占用正常,free很低,但是buff/cache和available挺高。这种情况一般不是内存泄漏,而是可用内存被系统缓存起来了。
如需手动释放,可执行 echo x > /proc/sys/vm/drop_caches 将缓存释放出来。(x=1,2,3)

1.2 used占用过高
这种情况下存在内存泄漏可能,需要继续向下分析。

2. 检查/tmp目录
/tmp目录是占用内存空间的,有时候日志或者其他临时文件过大,导致内存占用过多。
尽早检查tmp目录可以帮我们快速排查这个问题,避免分析半天最后发现是tmp临时文件占用导致。

[root@centos ~]# du -sh /tmp/*
0       /tmp/systemd-private-0bd2eb2d32be4029bb93736c12f9cfc6-httpd.service-93VBb6
0       /tmp/systemd-private-0bd2eb2d32be4029bb93736c12f9cfc6-ntpd.service-s017JD
0       /tmp/systemd-private-5245a0f476c64b80895d3fe3e5c5e9e6-httpd.service-Hp8PSy
0       /tmp/systemd-private-5245a0f476c64b80895d3fe3e5c5e9e6-ntpd.service-yQr1bn
0       /tmp/UNIX.domain
3. 检查进程的内存占用
[root@centos ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dbus       665  0.0  0.0  32660  1768 ?        Ssl  Mar24   2:29 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root       672  0.0  0.0  24380  1856 ?        Ss   Mar24   1:01 /usr/lib/systemd/systemd-logind
root       886  0.0  0.0 110092   856 tty1     Ss+  Mar24   0:00 /sbin/agetty --noclear tty1 linux
root       893  0.0  0.0      0     0 ?        S<   Mar24   0:18 [kworker/1:1H]
root       918  0.0  0.0 126312  1716 ?        Ss   Mar24   2:28 /usr/sbin/crond -n
root      2722  0.0  0.1 146228  5232 ?        Rs   11:36   0:01 sshd: root@pts/2
root      2726  0.0  0.0 116008  2728 pts/2    Ss   11:36   0:00 -bash
root      4000  0.2  0.0      0     0 ?        S    13:26   1:10 [kworker/1:3]
root      5773  0.0  0.1 106012  4108 ?        Ss   15:48   0:00 /usr/sbin/sshd -D
root      5829  0.1  0.0 272000  2292 ?        Ssl  15:48   0:29 /usr/sbin/rsyslogd -n
root      5964  0.0  0.3 312716 11960 ?        Ss   15:48   0:02 /usr/sbin/httpd -DFOREGROUND
apache    5965  0.0  0.1 312716  6164 ?        S    15:48   0:00 /usr/sbin/httpd -DFOREGROUND
apache    5966  0.0  0.1 312716  6164 ?        S    15:48   0:00 /usr/sbin/httpd -DFOREGROUND
apache    5967  0.0  0.1 312716  6164 ?        S    15:48   0:00 /usr/sbin/httpd -DFOREGROUND
apache    5968  0.0  0.1 312716  6164 ?        S    15:48   0:00 /usr/sbin/httpd -DFOREGROUND
apache    5969  0.0  0.1 312716  6164 ?        S    15:48   0:00 /usr/sbin/httpd -DFOREGROUND

ps命令可以帮助我们定位分析应用进程内存泄漏。
观察RSS列,如果有进程RSS占用偏高,则存在内存泄漏可能。
需分析该程序源码是否存在泄漏可能。

如果应用进程没有泄漏,则继续向下分析。

4. meminfo查看内存信息
[root@centos ~]# cat /proc/meminfo 
MemTotal:        1883844 kB
MemFree:          970208 kB
MemAvailable:    1321960 kB
Buffers:           51864 kB
Cached:           405336 kB
SwapCached:            0 kB
Active:           272120 kB
Inactive:         321892 kB
Active(anon):

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值