内存泄露和内存溢出:

内存泄露本意是申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用。

内存溢出是指存储的数据超出了指定空间的大小,这时数据就会越界。

一、如何认定内存泄露? 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会不断增大,相对的物理内存也会增加。