我有一个包含三个结构池的程序。对于它们中的每一个,我使用一个已用结构列表和另一个未使用结构列表。在执行过程中,程序会消耗结构,并按需将它们返回到池中。此外,还有一个垃圾收集器来清理“僵尸”结构并将它们返回到池中。
在执行开始时,正如预期的那样,虚拟内存显示分配了大约 10GB* 的内存,并且随着程序使用池,RSS 内存增加。
虽然使用过的节点回到池中,标记为未使用的节点,但 RSS 内存并没有减少。我预料到了这一点,因为操作系统不知道我对内存做了什么,无法注意到我是在真正使用它们还是在管理池。
我想做的是在我想要的时候强制未使用的内存返回到虚拟内存,例如,当 RSS 内存增加到 X GB 以上时。
有没有办法在给定内存指针的情况下标记一 block 内存区域,将其放入虚拟内存中?我知道这是操作系统的责任,但也许有办法强制执行。
也许我不应该关心这个,你怎么看?
提前致谢。
- 注意 1:此程序用于高性能计算,这就是它使用此内存量的原因。
我提供了几个文件的池使用情况与内存使用情况的图片。如您所见,池使用率的突然下降是由于垃圾收集器造成的,我希望看到这种下降是否反射(reflect)在内存使用率上。
最佳答案
只要您通过 mmap 而不是通过 malloc 分配内存,就可以这样做。你想使用 madvise带有 POSIX_MADV_DONTNEED
参数的函数。
请记住在再次使用它们之前使用 POSIX_MADV_WILLNEED
运行 madvise 以确保它们背后确实有内存。
这实际上并不能保证页面会被换出,但会在有时间时给内核一个强烈的提示来换出。
关于c - 使用结构池正确处理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24861791/