为什么用malloc分配的虚拟内存没有发布?
鉴于此C程序打印私人虚拟内存:
#include <stdio.h>
#include <stdlib.h>
#define _PSTAT64
#include <sys/param.h>
#include <sys/pstat.h>
#include <sys/unistd.h>
void pstatvm()
{
struct pst_vm_status pst;
int idx, count;
long long shared_vm = 0;
long long shared_ram = 0;
long long private_vm = 0;
long long private_ram = 0;
pid_t pid = getpid();
idx=0;
count = pstat_getprocvm(&pst, sizeof(pst), (size_t)pid, idx);
while (count > 0) {
switch ((long)pst.pst_type) {
case PS_IO: break;
/* Don't count IO space. It really is not RAM or swap. */
default:
if (pst.pst_flags & PS_SHARED) {
shared_vm += (long long) pst.pst_length;
shared_ram += (long long)pst.pst_phys_pages;
} else {
private_vm += (long long) pst.pst_length;
private_ram += (long long)pst.pst_phys_pages;
}
break;
}
idx++;
count = pstat_getprocvm(&pst, sizeof(pst), (size_t)pid, idx);
}
printf("%dtt", pid);
printf("%lldKtt", shared_vm*4);
printf("%lldKtt", shared_ram*4);
printf("%lldKtt", private_vm*4);
printf("%lldKn", private_ram*4);
}
int main()
{
void *p=NULL;
int cont = 1;
printf("pidttshared_vmtshared_ramtprivate_vmtprivate_ramn");
while(cont < 100)
{
p = malloc((cont*10)*1024*1024);
if (p == NULL)
{
printf("exitn");
exit(1);
}
pstatvm();
free(p); p=NULL;
sleep(1);
cont += 10;
}
printf ("nn");
cont = 0;
while(cont < 10)
{
sleep(100);
pstatvm();
++cont;
}
}
为什么private_vm不是由操作系统发布的?
pid shared_vm shared_ram private_vm private_ram
8988 3436K 2432K 26880K 320K
8988 3436K 2432K 129280K 336K
8988 3436K 2432K 231680K 352K
8988 3436K 2432K 334080K 368K
8988 3436K 2432K 436480K 384K
8988 3436K 2432K 538880K 400K
8988 3436K 2432K 641280K 416K
8988 3436K 2432K 743680K 432K
8988 3436K 2432K 846080K 448K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
8988 3436K 2432K 948480K 464K
从http://www.linuxforums.org/forum/programming-scripting/153369-solved-where-does-memory-allocated-malloc-actually-come.html:
在Linux / Unix中,所有应用程序内存都是虚拟的,除非它被交换到光盘上,否则它指向物理内存中的一个位置。 每个页面都可以单独寻址,所以尽管应用程序堆(使用malloc()分配的内存)在您的应用程序中显示为连续的,但它实际上可能散布在整个物理RAM中
如果你想分配大量内存区域,以便在应用程序不再需要时释放这些内存区域,那么直接使用POSIX mmap
和munmap
函数,而不要依赖足够大的malloc
请求转换为mmap
。
这可能是GNU C Library在GNU / Linux上的工作原理,但它不是标准定义的要求,所以期望不是可移植的。
很明显,您的HP-UX系统的malloc
保留了大量分配的底层存储。 但是,请注意虚拟机大小的增量大约是100 Mb左右 。 这表明分配器正在重新使用先前释放的内存,避免了碎片。 也就是说,当你释放一个300 Mb的数据块,然后分配一个400 Mb的数据时,它不会保留原来的300 MB,然后分配一个全新的400 Mb数据块; 它意识到以前被释放的300 MB空间可以被扩展。 分配器中可能存在额外的隐藏策略,而您的程序的分配模式未显示。 我们从程序中知道的是,当我们进行一次大的分配然后释放它时,分配器就能够保留它并扩展它以满足更大的分配请求。 这并不能证明分配器总是保留大量已释放的分配。 它可能是针对这种情况的优化(可能是为了支持重复的realloc
)。
malloc()
和free()
没有义务分配/取消分配虚拟内存。 他们应付堆。 不管事实如何, malloc()
使用sbrk()
放大堆(如果需要的话), free()
不会缩回堆,所以分配的虚拟内存量与malloc()
之后的值保持相同。
上一篇: Why is virtual memory allocated with malloc not released?