如何将Java进程锁定到内存? (MLOCK)

时间:2013-02-19 22:37:47

标签: java memory locking java-native-interface

我从2010年发现了这个堆栈溢出问题: Lock or Pin java process into memory

基本上它说将java进程锁定到内存的方法是使用JNI。它指出的例子是一个断开的链接。现在是2013年我的问题是..有更好的方法吗?是否有人在Java中使用mlock的某个地方?我对JNI和一般的C代码非常缺乏经验,但对Java非常熟悉(尽管我从未使用过JNI)。

由于

2 个答案:

答案 0 :(得分:0)

  

我想知道是否有一个好的java解决方案,如果可能的话,不会涉及JNI。

没有。在内存中固定应用程序是特定于操作系统的,标准JVM API不支持。


确定一项相当危险的事情......因为可能对整体系统性能造成严重影响。因此,在任何支持它的系统上需要root权限(或等效权限)。

我个人不会尝试这样做,并且会非常犹豫使用这样做的应用程序。你试图实现的是什么(可能)更好地以其他方式完成......


  

出于安全考虑,我想这样做。

喔。那么实际试图做的是阻止将“超级秘密”内容写入光盘上的交换/页面空间?

  1. 我不相信mlock会阻止写入内容。

  2. 如果有人可以访问交换光盘,他们可能会使用其他机制来提取数据;例如通过使用“/ dev / mem”或等效物来从物理内存或进程虚拟内存中读取内容。

  3. 解决交换盘上“超级机密”问题的正常方法是使用char数组而不是字符串来保存这些东西,并在完成后立即用零覆盖它们。

  4. 或调查光盘级加密。

答案 1 :(得分:0)

我正在寻找类似的东西,发现了这个:

https://github.com/LucidWorks/mlockall-agent/

对于固定Java内存的问题,这似乎是一个非常好的解决方案。如果使用它,请确保将初始堆大小(-XMs)设置为与最大堆大小(-Xmx)相同 - 文档说如果不这样做,则在初始堆之后分配任何内存不会被锁定。