当前位置: 技术问答>linux和unix
为什么linux的内存一直用不完啊?请大虾们看看
来源: 互联网 发布时间:2016-09-02
本文导语: 我做了个试验,写了个程序,不断的malloc,如下 while (1) { sleep(1); ptr = malloc(1024000); //以1000K为单位 if (ptr == NULL) { printf("malloc failn"); ...
我做了个试验,写了个程序,不断的malloc,如下
while (1)
{
sleep(1);
ptr = malloc(1024000); //以1000K为单位
if (ptr == NULL)
{
printf("malloc failn");
}
i++;
printf("NO.%d,malloc success ptr is %xn",i, ptr);
}
用free持续的观察,发现free出来的结果差不多一直保持下面这种状态
total used free shared buffers cached
Mem: 256724 252544 4180 0 50456 146060
-/+ buffers/cache: 56028 200696
Swap: 514040 0 514040
非常不解,我想着应该能看到内存耗尽,分配失败的,但一直没出现,总共256M的物理内存,malloc了差不多2G,谁能解释下。
据说linux会使用虚拟内存,难道虚拟内存一直会扩展下去,直到硬盘耗尽吗?
另外,实际项目中应该怎么看linux的内存已经不够用呢?
while (1)
{
sleep(1);
ptr = malloc(1024000); //以1000K为单位
if (ptr == NULL)
{
printf("malloc failn");
}
i++;
printf("NO.%d,malloc success ptr is %xn",i, ptr);
}
用free持续的观察,发现free出来的结果差不多一直保持下面这种状态
total used free shared buffers cached
Mem: 256724 252544 4180 0 50456 146060
-/+ buffers/cache: 56028 200696
Swap: 514040 0 514040
非常不解,我想着应该能看到内存耗尽,分配失败的,但一直没出现,总共256M的物理内存,malloc了差不多2G,谁能解释下。
据说linux会使用虚拟内存,难道虚拟内存一直会扩展下去,直到硬盘耗尽吗?
另外,实际项目中应该怎么看linux的内存已经不够用呢?
|
linux下的内存管理,保证没有进程都有独立的4G地址空间(为什么4G,是因为2^32=4G),32就是地址总线的BIT数量。而64位操作系统,能管理的内存空间就=2^64,是个非常恐怖的空间。
4G空间中,大概有1G作为系统用的。程序能用的应该超过2G以上。---具体地址分配的空间,参考相关书籍吧。
你上面的代码,每隔1秒大概申请1M。那么申请到3G需要循环大概3000次。
则如果要把3G内存消耗完毕,需要3000/60 = 50分钟。
你把你的程序运行上1小时,看看能不能消耗完。
4G空间中,大概有1G作为系统用的。程序能用的应该超过2G以上。---具体地址分配的空间,参考相关书籍吧。
你上面的代码,每隔1秒大概申请1M。那么申请到3G需要循环大概3000次。
则如果要把3G内存消耗完毕,需要3000/60 = 50分钟。
你把你的程序运行上1小时,看看能不能消耗完。
|
malloc 只是glibc 中的一个库函数,它调用内核的sys_brk 系统调用,从虚拟地址空间中找到并分配一块尚未被分配的空间。并不是每次调用malloc 时,都会调用sys_brk,而是调用sys_brk 分配一段连续的虚拟地址空间(以页为单位)后,再对这段虚拟地址空间进行管理。比如,我们连续使用malloc 分配4 个字节的内存空间,不会每次都为其分配一个页虚拟内存,而是只需分配一页内存,然后在这4K 的空间内连续分配小块的内存空间。
sys_brk 分配的仍然不是物理内存,它只是分配对应相应虚拟地址空间的若干个pte。只有在发生内存写入时,才在相应pte 上触发缺页中断。内核响应中断,调用do_page_fault 函数分配物理内存页,完成虚拟地址与物理地址间的映射。
sys_brk 分配的仍然不是物理内存,它只是分配对应相应虚拟地址空间的若干个pte。只有在发生内存写入时,才在相应pte 上触发缺页中断。内核响应中断,调用do_page_fault 函数分配物理内存页,完成虚拟地址与物理地址间的映射。