在实际的项目中,最难缠的问题就是内存泄漏,当然还有panic之类的,内存泄漏分为两部分用户空间的和内核空间的.我们就分别从这两个层面分析一下.
用户空间查看内存泄漏和解决都相对简单。定位问题的方法和工具也很多相对容易.我们来看看.
1. 查看内存信息
cat /proc/meminfo、free、cat /proc/slabinfo等
2. 查看进程的状态信息
top、ps、cat /proc/pid/maps/status/fd等
通常我们定位问题先在shell下ps查看当前运行进程的状态,嵌入式上可能显示的信息会少一些.
点击(此处)折叠或打开
root@hos-machine:~# ps -uaxw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 119872 3328 ? Ss 8月10 0:24 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 8月10 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 8月10 0:44 [ksofTIrqd/0]
root 5 0.0 0.0 0 0 ? S
root 7 0.0 0.0 0 0 ? S 8月10 3:50 [rcu_sched]
root 8 0.0 0.0 0 0 ? S 8月10 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 8月10 0:12 [migraTIon/0]
root 10 0.0 0.0 0 0 ? S 8月10 0:01 [watchdog/0]
root 11 0.0 0.0 0 0 ? S 8月10 0:01 [watchdog/1]
root 12 0.0 0.0 0 0 ? S 8月10 0:12 [migraTIon/1]
root 13 0.0 0.0 0 0 ? S 8月10 1:18 [ksofTIrqd/1]
root 15 0.0 0.0 0 0 ? S
root 16 0.0 0.0 0 0 ? S 8月10 0:01 [watchdog/2]
root 17 0.0 0.0 0 0 ? S 8月10 0:12 [migration/2]
root 18 0.0 0.0 0 0 ? S 8月10 1:19 [ksoftirqd/2]
root 20 0.0 0.0 0 0 ? S
root 21 0.0 0.0 0 0 ? S 8月10 0:01 [watchdog/3]
root 22 0.0 0.0 0 0 ? S 8月10 0:13 [migration/3]
root 23 0.0 0.0 0 0 ? S 8月10 0:41 [ksoftirqd/3]
root 25 0.0 0.0 0 0 ? S
root 26 0.0 0.0 0 0 ? S 8月10 0:00 [kdevtmpfs]
root 27 0.0 0.0 0 0 ? S
root 329 0.0 0.0 0 0 ? S
root 339 0.0 0.0 0 0 ? S
root 343 0.0 0.0 0 0 ? S
root 368 0.0 0.0 39076 1172 ? Ss 8月10 0:10 /lib/systemd/systemd-journald
root 373 0.0 0.0 0 0 ? S 8月10 0:00 [kauditd]
root 403 0.0 0.0 45772 48 ? Ss 8月10 0:01 /lib/systemd/systemd-udevd
root 444 0.0 0.0 0 0 ? S
systemd+ 778 0.0 0.0 102384 516 ? Ssl 8月10 0:04 /lib/systemd/systemd-timesyncd
root 963 0.0 0.0 191264 8 ? Ssl 8月10 0:00 /usr/bin/vmhgfs-fuse -o subtype=vmhgfs-fuse,allow_other /mnt/hgfs
root 987 9.6