0

我们正在实现一个消耗内存的长时间运行的服务器,它在内部使用 jemalloc 来分配/释放内存。服务器逐批、连续地处理数据。对于每个批次,它分配内存(通过 malloc())并处理批次内的数据,然后释放内存(通过 free())。

问题是,当新数据进来时,它必须分配新的内存进行处理,这会导致很多页面错误,因为之前从操作系统分配的内存页面会在之前的 free() 上返回(或者,被 madvise 清除)

有没有办法保留(在进程地址空间中)先前释放的内存,以便下一次分配可以重用它们?

请注意,因为每个分配/解除分配都不是固定大小的,所以固定大小的内存池不适合这里。这里需要一些像 jemalloc 这样的通用分配器。

jemalloc 中是否有配置,以便所有分配和释放的内存都保留在进程地址空间中以供以后重用?在服务器启动时分配一个大块(如 64GB)并在这个单块内处理分配/解除分配/碎片/碎片整理是可以接受的。

4

0 回答 0