内存泄露和内存溢出:
内存泄露本意是申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用。
内存溢出是指存储的数据超出了指定空间的大小,这时数据就会越界。
一、如何认定内存泄露? VmRSS
ps axu | grep lighttpd #找到进程的pid
cat /proc/pid/status #拿到进程的相关信息。
VmPeak:进程地址空间的大小
VmSize:进程虚拟空间地址的大小,是VmLib, VmExe, VmData, 和 VmStk的总和。
VmLck:进程已锁住的物理内存大小
VmRSS:应用程序正在使用的物理内存的大小
VmData:程序数据段的大小。
VmStk:进程在用户态的栈的大小
动态链接库所使用的虚拟内存
可执行的和静态链接库所使用的虚拟内存
内核态内存问题定位:cat /proc/slabinfo,查询内核态内存池slab的使用情况。
二、linux 下载安装valgrind工具
Valgrind包括以下一些工具:
1.Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够给发现开发中绝大多数的内存错误使用的情况,比如:使用未初始化
2.callgrind:它主要用来检查程序中函数中调用过程中出现的问题
3.cachegrind:它主要用来检查程序中缓存使用出现的问题
4.Helgrind:它主要用来检查多线程中出现的竞争问题
5.Massif:它主要用来检查程序中堆栈使用中出现的问题
6.Extension:可以使用core提供的 功能,自己编写特定的内存调试工具
2.mtrace命令
三、定位方法——mtrace命令
gcc -g -DDEBUG test.c (千万要注意, -g不可漏掉, 否则, 虽然最后能定位到内存泄露, 但却找不到在代码的第几行。由于我代码中没有Debug宏控制, 所以编译时, -DDEBUG是可以省略的, 因此, 直接写成gcc -g test.c即可)
运行: ./a.out
定位: mtrace a.out taoge.log
无非就是记录每一对malloc/free的调用情况, 从这个意义上来讲, mtrace替代了部分我们的眼睛, 紧紧地盯着malloc/free, 所以能看到泄露还是不泄露啊。
ps auxw|more
VMZ和RSS的对比信息.VMZ就是这个进程申请的虚拟地址空间,而RSS是这个进程占用的实际物理内存空间.通常一个进程如果有内存泄露VMZ会不断增大,相对的物理内存也会增加。