内存泄漏定位思路和方法
本文主要针对基于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):