我正在尝试为golang构建一个缓存包,它依赖于mmap在内存中存储大量内容,甚至比系统还多。缓存不需要是持久的;每次应用程序运行时,它都会从 Redis 加载缓存。
但是,当程序超过物理内存的最大限制时会发生什么?下一个分配发生在磁盘上吗?如果内核从mamp 回收内存,内容会发生什么?它消失了吗?我是否需要将 mmap 同步到磁盘以防止发生这种情况?或者内核会自动执行此操作吗?
答案1
当物理内存耗尽时,系统将开始将一些最近最少访问的内存页移出到交换分区。通常,完全由内核来选择这些页面。它们可能不是您的页面,而是属于另一个已经有一段时间没有使用的进程。
如果你想干预,你可以使用疯狂的维斯(2)系统调用向您的内核提供有关内存使用策略的建议,以便它能够相应地进行调整。