提问人:Yale 提问时间:2/1/2023 更新时间:2/1/2023 访问量:154
使用 malloc 和 tcmalloc 释放后如何释放虚拟内存?
How could I free the virtual memory after using malloc and free by tcmalloc?
问:
在我的程序中,我使用 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() ,但它只释放实际内存,但用于虚拟地址。我希望虚拟地址也被释放。
答: 暂无答案
评论