【问题标题】:Tell Java not to push an object into swap space告诉 Java 不要将对象推入交换空间
【发布时间】:2009-03-03 08:50:48
【问题描述】:

是否可以告诉 JVM 向操作系统提示某个对象最好不要被推出交换空间?

【问题讨论】:

    标签: java memory-management virtual-memory


    【解决方案1】:

    简短的回答是否定的。

    Java 不允许您对交换的内容和“固定”到 RAM 中的内容进行任何控制。

    担心这类事情通常表明您的项目中存在其他问题。操作系统总体上会更好地确定应该交换的内容和不应该交换的内容。你的工作是编写你的软件,这样它就不会试图猜测底层 VM/OS 会做什么,而只需专注于提供你的功能和一个好的设计。

    【讨论】:

      【解决方案2】:

      这个问题在 Eclipse 中也很明显,KeepResident 脏黑客插件 (http://suif.stanford.edu/pub/keepresident/) 避免了它。

      这可能是一个很好的起点?我还没有看到它被广泛使用,所以也许它已经集成在标准的 Eclipse 发行版中?

      【讨论】:

        【解决方案3】:

        嘿!您正在使用托管语言进行编程。你为什么要考虑这些?如果您无法忘记这些东西,您可以随时选择使用 C 语言进行编程。

        【讨论】:

        • 我猜另一种选择是不强制应用程序一次将所有内容保存在内存中。这个问题更多地来自好奇心而不是实际需要。可以用 C 来做吗?
        • 可以在内存中粘贴一些内存页。这是大多数 VM 环境所做的。
        【解决方案4】:

        简短的回答是(如上所述):不要这样做:-)。

        但是原则上是可以的。大多数操作系统确实允许“锁定”某些内存区域以防止被交换(例如,Linux 下的mlock(2),Windows 下的 VirtualLock)。

        VM 可以通过合适的 API 将此功能公开给 Java 应用程序。但是,我所知道的任何虚拟机都没有这样做,所以要这样做,您首先必须修改您的虚拟机...

        【讨论】:

          【解决方案5】:

          如果您定期访问它,那么它当时恰好位于的任何页面(JVM 在垃圾收集期间移动内容)都不会被分页,除非其他东西更积极地请求内存。但是没有办法告诉JVM不要将它移动到另一个页面,并且操作系统只知道页面。

          【讨论】:

            【解决方案6】:

            不是答案,但缺少评论点,我保留此选项:)

            有理由不在交换中存储信息。无论是密码还是其他机密信息,都不应该在磁盘上永久存在。另外,周末后回到我的电脑,我希望内存中的一些东西可以立即可用。

            (非 Java)本机可能有一些方法可以为每个/大多数操作系统执行此操作。对于 Windows,这绝对是可能的。但不是直接从 java 出来的(想想 JNI)。 根据此选项的绝望程度,您始终可以考虑使用视频内存或其他一些不会换出的硬件设备。这允许您仍然使用标准的 java api,例如 jogl 来存储信息。但不知何故,我怀疑这与您正在寻找的实施/结果有关。

            【讨论】:

              【解决方案7】:

              基本上,您希望将整个 JVM 一直保留在主内存中。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-12-28
                • 2010-12-19
                • 1970-01-01
                • 2013-10-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多