< 返回版块

manlge 发表于 2024-05-23 13:14

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

评论区

写评论
我心飞翔 2024-05-28 09:52

你要用相同的方法分配,vec push 和直接分配时不一样的

WANG-lp 2024-05-23 17:49

建议控制变量法,这里两份代码申请内存大小以及使用方式都是不一样的。

--
👇
manlge: 很感谢你的建议,我也考虑过这方面的因素,但我在同样的环境,用默认的glibc的malloc,则不存在不回收的问题

int main(int argc, char *argv[]){
    void* p = malloc(1024000000);
    memset(p, 0, 1024000000);

    printf("allocated 1g memory\n");
    getchar();

    free(p);

    printf("deallocated 1g memory\n");
    getchar();

    return 0;
}

--
👇
WANG-lp: 跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。

作者 manlge 2024-05-23 17:02

很感谢你的建议,我也考虑过这方面的因素,但我在同样的环境,用默认的glibc的malloc,则不存在不回收的问题

int main(int argc, char *argv[]){
    void* p = malloc(1024000000);
    memset(p, 0, 1024000000);

    printf("allocated 1g memory\n");
    getchar();

    free(p);

    printf("deallocated 1g memory\n");
    getchar();

    return 0;
}

--
👇
WANG-lp: 跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。

WANG-lp 2024-05-23 15:06

跟内存分配器有关系,内存在应用中释放后,内存分配器并不是立即释放内存给操作系统的,具体跟系统内存压力以及内存分配器策略有关系。可以尝试使用例如tcmalloc替换默认的内存分配器,tcmalloc有ReleaseFreeMemory可以手动让内存分配器将内存还给系统。

作者 manlge 2024-05-23 13:17

操作系统CentOS7和Ubuntu 22.04 LTS都试过

1 共 5 条评论, 1 页