为什么用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 mmapmunmap函数,而不要依赖足够大的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()之后的值保持相同。

链接地址: http://www.djcxy.com/p/86501.html

上一篇: Why is virtual memory allocated with malloc not released?

下一篇: Allocating more memory than there exists using malloc