如何在Linux中真正释放大页,以供新进程使用?

4

关于这个问题,我并没有找到太多有用的信息。希望能有人提供帮助。我的目标是启动一个100GB的Java堆,作为大数据缓存。为了避免与文件系统缓存等产生冲突,并且性能更好,我将其分配在大页中。

我已经保留了51,200个2MB的大页,一切都正常启动。然而,当我杀死进程并重新启动时,Linux会将其中一些页面保留为“rsvd”状态。

# less /proc/meminfo | grep Hug
AnonHugePages:         0 kB
HugePages_Total:   52000
HugePages_Free:    50952
HugePages_Rsvd:     1634
HugePages_Surp:        0
Hugepagesize:       2048 kB

据我所知,系统中没有其他配置请求或保留这些页面的内容。Linux是否提供一种方法让我查看是什么占用了这些保留空间并且可以取消这些保留?
从我找到的所有谷歌信息来看,它们实际上并没有被使用,只是Linux将它们保留,但有趣的是当我重新启动我的大型JVM时,却不允许我使用它们。
非常感谢您的帮助。

有趣。这可能属于其他 SE 网站之一,例如 unix(如果您最终得到了很多关闭票)。 - Rup
这很合理。我会让它在这里静置一会儿,这样我就不会在所有的板块上重复发同样的问题了。 - rob.wisniewski
1个回答

0

你很可能可以让Java重复使用仍在内存中的对象,但是运行以下代码将会删除所有未被使用的对象和其他存储的内容。

echo 3 | sudo tee /proc/sys/vm/drop_caches 

但实际上你不需要 - 尽管已经“占用”了,但其实并没有。一旦有任何东西实际上需要 RAM,Linux 就会将其交还回来

欲了解更多信息,请查看 http://www.linuxatemyram.com/

你实际上不需要做任何事情,这是正常的。你实际上唯一需要担心的内存就是应用程序运行时的内存。


这正是我想到的,但有趣的是,当我尝试重新启动JVM时,它无法分配堆空间。虽然我知道drop_caches还会清除文件系统缓存,我不确定我是否喜欢这个想法,但我会尝试一下。 这将是一个很好的测试。 - rob.wisniewski
我以root身份尝试了该命令,但是hugepages没有被释放。 - HCSF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接