Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM虚拟地址空间的锁定_Java_Linux_Memory Management_Jvm - Fatal编程技术网

Java JVM虚拟地址空间的锁定

Java JVM虚拟地址空间的锁定,java,linux,memory-management,jvm,Java,Linux,Memory Management,Jvm,我注意到在Java应用程序上执行GC时内存被分页到交换空间的问题,所以我决定尝试使用mlockall系统调用来解决这个问题,这大大减少了STW延迟。但是,我很难理解当系统调用失败时会发生什么 堆是2048MB,Xms==Xmx,并且在启动之后立即使用JNI调用mlockall。只有当前虚拟地址空间被锁定,即呼叫是 mlockall(MCL_CURRENT) 由于这是一个Linux系统,我必须增加进程的“最大锁定内存”限制,否则调用将失败 问题是,当我第一次增加限制时,我认为3GB对于JVM进程

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

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

mlockall(MCL_CURRENT)
由于这是一个Linux系统,我必须增加进程的“最大锁定内存”限制,否则调用将失败

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

当限制为3GB时,为什么它无法锁定2.5GB的RSS?当虚拟内存比这个值高得多时,为什么能够用15GB的限制锁定它?我真的希望在启动时限制尽可能接近RSS,否则限制是毫无意义的


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

mlockall()
锁定映射到当前进程地址空间的所有页面,而不仅仅是已经驻留的页面,因此RSS值在这个意义上没有意义。也许您只想锁定某些区域(例如Java堆)。在这种情况下,扫描
/proc/self/maps
并使用
mlock()
锁定所需区域可能会有所帮助。顺便说一句,您是否已将vm.swappiness设置为0?好吧,好吧,好吧-我来自Solaris,但swappiness=0似乎起到了作用!