学习linux内核之前一直对“内存泄漏”有这么一个认识,就是程序申请了一段内存后,即使程序退出了,那段内存也无法访问了。

  后面学习linux内核中的进程管理部分后,觉得这个想法存在问题。当一个进程执行完毕的时候,内核是要对这个进程申请的内存进行释放,因为这是用户地址空间的虚拟内存,所以无论这个进程是否delete,操作系统都是要进行回收的。

  为了验证我的想法,进行了如下测试:

#include<iostream>
#include <unistd.h>
using namespace std;
int main(){
    double *p=new double[26214400];//申请大约200M内存
    for(int i=0;i<26214400;i++){
    p[i]=i;
    }
    sleep(10);//睡眠10s
    return 0;
}

测试结果如下:

进程退出javacore 进程退出后,泄露的内存_进程退出javacore

这是程序运行前,使用了260M内存,剩余237M内存

进程退出javacore 进程退出后,泄露的内存_程序运行_02

程序运行的时候使用了461M内存,剩余36M内存。程序消耗201M内存

进程退出javacore 进程退出后,泄露的内存_内存泄漏_03

程序运行结束后,内存使用情况与程序未运行基本一样。

同样,楼主也测试了异常退出后的程序,内存也会被操作系统成功释放。

也许,很多人会问:既然操作系统帮我把丢了的内存给收回来了,我是不是可以不用管内存泄漏了?

我认为不是这样的:

  1.程序和操作系统各有各自的责任,你编写的程序一定要你所申请的内存的正确释放。假如你的程序移植到其他系统,而那个系统没有内存回收的功能呢?

  2.很多服务器进程一般是守护进程,也就是一直在运行的进程。如果这个运行过程中,不停地产出内存泄漏,过不了多久程序便死了。系统的稳定性和性能大大降低。

综上,无论操作系统是否帮你收拾泄露的内存,请负责好自己的部分。