fn alloc_free_vec() {
let mut vec = Vec::new();
for i in 0..30000000 {
vec.push(format!("abcdefgabcdefg{}", i))
}
drop(vec);
}
fn main() {
alloc_free_vec();
//block
std::io::stdin().read_line(&mut String::new()).unwrap();
}
上面的代码为什么alloc_free_vec没有把vec的内存全部释放呢?还有1.3G,手工drop也不行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20438 root 20 0 1386.1m 1.3g 0.7m S 0.0 8.9 0:04.62 heap_test
1
共 5 条评论, 1 页
评论区
写评论你要用相同的方法分配,vec push 和直接分配时不一样的
建议控制变量法,这里两份代码申请内存大小以及使用方式都是不一样的。
--
👇
manlge: 很感谢你的建议,我也考虑过这方面的因素,但我在同样的环境,用默认的glibc的malloc,则不存在不回收的问题
--
👇
WANG-lp: 跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。
很感谢你的建议,我也考虑过这方面的因素,但我在同样的环境,用默认的glibc的malloc,则不存在不回收的问题
--
👇
WANG-lp: 跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。
跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。
操作系统CentOS7和Ubuntu 22.04 LTS都试过