是否可以告诉 JVM 提示操作系统最好不要将某个对象推出交换空间?
7 回答
最简洁的答案是不。
Java 不允许您对交换的内容和“固定”到 RAM 中的内容进行任何控制。
担心这类事情通常表明您的项目中还有其他问题。操作系统总体上会更好地确定应该交换什么和不应该交换什么。你的工作是编写你的软件,这样它就不会试图猜测底层 VM/OS 会做什么,而只需专注于提供你的功能和一个好的设计。
这个问题在 Eclipse 中也很明显,KeepResident 肮脏的黑客插件(http://suif.stanford.edu/pub/keepresident/)避免了它。
这可能是一个很好的起点?我还没有看到它被广泛使用,所以也许它已经集成到标准的 Eclipse 发行版中了?
嘿!您正在使用托管语言进行编程。你为什么要考虑这些?如果你无法忘记这些东西,你总是可以选择用 C 编程。
简短的回答是(如上所述):不要这样做:-)。
不过原则上是可以的。大多数操作系统确实允许“锁定”某些内存区域以防止被交换(例如Linux 下的mlock(2),Windows 下的 VirtualLock)。
VM 可以通过适当的 API 将此功能公开给 Java 应用程序。但是,我所知道的虚拟机都没有这样做,所以要做到这一点,您首先必须修改您的虚拟机......
如果您定期访问它,那么它当时恰好位于的任何页面(JVM 在垃圾收集期间移动东西)都不会被分页,除非其他东西更积极地请求内存。但是没有办法告诉JVM不要将它移动到另一个页面,并且操作系统只知道页面。
不是答案,但缺乏评论点,我保留此选项:)
有理由不在交换中存储信息。无论是密码还是其他机密信息,都不应该在磁盘上永久存在。此外,周末后回到我的电脑,我希望一些东西可以立即可用。
(非Java)本机可能有一些方法可以为每个/大多数操作系统执行此操作。对于 Windows,这绝对是可能的。但不是直接从 java 出来的(想想 JNI)。根据此选项的绝望程度,您始终可以考虑使用视频内存或其他一些不会换出的硬件设备。这允许您仍然使用标准的 java api,例如 jogl 来存储信息。但不知何故,我怀疑这与您正在寻找的实施/结果有关。
基本上,您希望将整个 JVM 一直保留在主内存中。