锁定JVM虚拟地址空间

时间:2014-04-15 12:13:24

标签: java linux memory-management jvm

我已经注意到在我的Java应用程序上执行GC时将内存分页到交换空间的问题,所以我决定尝试使用mlockall系统调用来解决它,这大大减少了STW延迟。但是,我很难理解系统调用失败时发生的事情。

堆是2048MB和Xms == Xmx,并且在启动后立即使用JNI调用mlockall。仅锁定当前虚拟地址空间,即呼叫为...

mlockall(MCL_CURRENT)

由于这是一个Linux系统,我不得不增加进程的“最大锁定内存”限制,否则调用将失败。

问题是,当我第一次增加限制时,我认为3GB足够用于JVM进程,但随后mlockall调用失败。在启动时,RSS为2.5GB,虚拟几乎为30GB(从top命令查看)。当我将限制增加到15GB时,它就会成功。

当限制为3GB时,为什么无法锁定2.5GB的RSS?当虚拟内存/看起来比这个值高很多时,怎么能用15GB限制来锁定它?我真的希望在启动时尽可能接近RSS的限制,否则有一个限制是没有意义的......

我无法完全关闭系统上的交换,所以我最后的办法是使用mlockall。此外,系统有足够的内存,因此这不是将内存分页到交换空间的原因。

0 个答案:

没有答案