You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中HashMap与Vec疑似内存泄漏问题求助

Rust HashMap/Vec 内存未释放问题解析

你遇到的不是内存泄漏,而是Rust默认内存分配器的缓存机制导致的正常现象,具体原因如下:

1. 内存分配器的缓存策略

当你释放内存(比如调用clear()或变量离开作用域)时,Rust使用的内存分配器(默认是系统分配器,不同平台存在差异)不会立刻将内存归还给操作系统。它会把这些内存保留为内部缓存,用于后续的内存分配请求——这是现代内存分配器的通用优化手段,能避免频繁向操作系统申请/释放内存带来的性能开销。

2. HashMap::clear()的实际行为

HashMap::clear()仅会移除所有键值对,释放键和值本身占用的内存,但HashMap的底层存储结构(比如哈希桶数组)会被保留,以便后续插入数据时直接复用,避免重新分配底层数组的开销。即使data变量离开make_data函数作用域被销毁,分配器也不会主动把这些内存还给操作系统。

换成Vec后出现同样情况,是因为Vec调用clear()后也会保留底层缓冲区,分配器同样会缓存释放的内存。

3. 验证这不是内存泄漏的方法

你可以在make_data()之后再创建一个同样规模的数据集,观察内存使用情况:

use std::{io::stdin, collections::HashMap};

fn main() {
    make_data();
    // 再次创建同样规模的HashMap,观察内存不会大幅增长
    make_data();
    let mut line = String::new();
    println!("Please press enter key to exit.");
    stdin().read_line(&mut line).expect("Cannot read console");
}

fn make_data() {
    let mut data = HashMap::new();
    for i in 0..10_000_000 {
        let (key, value) = (format!("Key{}", i), String::from("Long long long text Long long long text Long long long text Long long long text Long long long text Long long long text"));
        data.insert(key, value);
    }
    data.clear();
}

运行这段代码会发现,第二次调用make_data()时,内存占用不会再增加1.5GB左右,而是直接复用之前缓存的内存,这就证明内存并没有泄漏,只是被分配器暂存了。

4. 强制归还内存到操作系统(非必要操作)

如果确实需要让内存立刻归还给操作系统,可以切换到不缓存内存的分配器,或者使用平台特定API。比如使用jemallocator并配置相关参数,或是在Linux下通过FFI调用malloc_trim(0),但一般来说这种操作没有必要,分配器会在合适时机自动管理内存。

内容的提问来源于stack exchange,提问作者Ug-Projekt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:45:55