1

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

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

谢谢

4

2 回答 2

2

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

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


做一件相当危险的事情……因为可能会对整体系统性能产生严重影响。因此,它应该在任何支持它的系统上都需要 root 权限(或同等权限)。

我个人不会尝试这样做,并且会非常犹豫使用执行此操作的应用程序。你想要达到的目标(可能)会以其他方式更好地完成......


出于安全原因,我想这样做。

哦。所以你实际上想要做的是阻止“超级秘密”的东西被写入磁盘上的交换/页面空间?

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

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

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

  4. 或者调查光盘级加密。

于 2013-02-19T23:57:36.390 回答
1

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

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

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

于 2013-11-08T10:28:37.213 回答