使用 malloc 和 tcmalloc 释放后如何释放虚拟内存?

How could I free the virtual memory after using malloc and free by tcmalloc?

提问人:Yale 提问时间:2/1/2023 更新时间:2/1/2023 访问量:154

问:

在我的程序中,我使用 tcmalloc 进行内存分配和释放。为了及时将内存保留回内存,调用完成后,使用 MallocExtension::instance()->ReleaseFreeMemory()**。但是,这只能确保释放实际内存,并且虚拟内存仍被占用。

我的程序需要经过一系列操作后,通过 shmat 挂载一个文件到指定的内存地址。如果 tcmalloc 使用过多的虚拟内存,则挂载地址可能会变得不可用。

有没有办法在tcmalloc中释放虚拟内存,或者Linux中是否有可用的功能?

int main() {
    int i = 0;
    while (i < 100) {
        char* a = (char*)malloc(1024 * 1024 * 2 * i); 
        malloc_stats();
        free(a);
        MallocExtension::instance()->ReleaseFreeMemory();
        malloc_stats();
        i++;
        usleep(1000 * 300);
    }   
    // in last loop , actual memory used  is small , but Virtual address space used is big...
    // if now I use shmat to mount something, it maybe fail.
    return 0;
}  
MALLOC:      207634928 (  198.0 MiB) Bytes in use by application
MALLOC: +            0 (    0.0 MiB) Bytes in page heap freelist
MALLOC: +        56408 (    0.1 MiB) Bytes in central cache freelist
MALLOC: +            0 (    0.0 MiB) Bytes in transfer cache freelist
MALLOC: +          440 (    0.0 MiB) Bytes in thread cache freelists
MALLOC: +     11251864 (   10.7 MiB) Bytes in malloc metadata
MALLOC:   ------------
MALLOC: =    218943640 (  208.8 MiB) Actual memory used (physical + swap)
MALLOC: +  10130219008 ( 9660.9 MiB) Bytes released to OS (aka unmapped)
MALLOC:   ------------
MALLOC: =  10349162648 ( 9869.7 MiB) **Virtual address space used**

我尝试使用 MallocExtension::instance()->ReleaseFreeMemory() ,但它只释放实际内存,但用于虚拟地址。我希望虚拟地址也被释放。

linux 内存 tcmalloc

评论


答: 暂无答案