2014-07-21 28 views
4

我有一个带有三个结构池的程序。对于他们中的每一个,我都使用一个已用结构体的列表,另一个用于未使用的结构体。在执行过程中,程序会消耗结构,并按需将它们返回给池。此外,还有一个垃圾收集器清理“僵尸”结构并将它们返回到池中。正确处理内存池中的内存

在执行开始时,如预期的那样,虚拟内存显示大约分配了10GB *的内存,随着程序使用该池,RSS内存增加。

虽然使用的节点回到池中,标记为未使用节点,但RSS内存不会减少。我期待这一点,因为操作系统不知道我在处理内存,我无法注意到我是在真正使用它们还是管理一个池。

我想要做的就是强制未使用的内存随时回到虚拟内存,例如,当RSS内存增加到X GB以上时。

给出内存指针,有什么方法可以将内存区域放入虚拟内存吗?我知道这是操作系统的责任,但也许有办法强制它。

也许我不应该关心这个,你怎么看?

在此先感谢。

  • 注1:该程序用于高性能计算,这就是为什么它使用这种内存量。

我为一些文件提供了池使用情况和内存使用情况的图片。正如你所看到的,池使用的突然下降是由于垃圾收集器,我想看到的是,这种下降反映在内存使用情况中。

Struct Pools Usage & Memory Usage

+2

您可能想要说明您的平台/操作系统,因为这是高度依赖于系统的。 –

+0

我在Linux 2.6.32(70GB RAM)和Mac OS X Mavericks(16GB RAM)上做了测试 –

+2

我不明白你为什么要强制系统将你的结构标记为“免费”,因为你可以在闲暇时在您的程序中重新使用它。 – Coconop

回答

1

您可以通过malloc的,只要你是通过分配MMAP你的记忆,并没有做到这一点。您希望使用madvise函数和POSIX_MADV_DONTNEED参数。

只要记得运行madvise POSIX_MADV_WILLNEED再次使用它们之前,以确保其中有实际的内存。

这实际上并不能保证页面会被换出,但当内存有时间时,内核就会提供强大的提示。

+0

好吧,但是,如果没有mmap,没有办法做到这一点。它有一些可移植性问题。 –

+0

@carlosvega是的,这是正确的,它是非常不可移植的,但是我可以告诉你没有办法做到这一点,作为C标准的一部分,许多平台根本无法做到这一点。然而,这种方法会适用于相当数量的unix喜欢,所以可能会像你所能得到的那样好。 – Vality