首页 文章

JVM是否可以自动使用更多交换空间来防止内存不足错误

提问于
浏览
2

Understanding JVM Memory Allocation and Java Out of Memory: Heap Space所示,当分配堆空间时,JVM不区分物理和虚拟内存 . 当Java对象和计算的内存分配开始发生时,JVM开始区分虚拟和物理内存 . 给定足够的交换空间(在Linux机器上),为什么会发生内存不足错误? JVM不应该只使用交换空间来完成计算,尽管速度很慢 .

例如:RAM:14GB,交换空间:10GB

如果一个java应用程序需要20GB的空间,它是否可以利用交换空间(虚拟内存)并完成运行应用程序?

堆空间和虚拟内存之间相对于java应用程序的相互影响是什么?

2 回答

  • 4

    你不明白它是如何工作的 .

    进程 never 知道它们使用的内存部分在虚拟内存中,哪些部分在物理内存中 .

    这是由操作系统以透明的方式管理的 . 通常,最常用或最近使用的“块”(正确的术语是“页面”)的存储器保存在物理存储器中 . 程序只需要内存,操作系统是分配它并决定每个页面所在位置(虚拟或物理)的操作系统 .

    要使用某些内存,您必须拥有该块位于物理内存中的页面 . 将一页内存从虚拟移动到物理是非常昂贵的,所以你必须尽量避免它 . 因此,您通常指定堆小于物理内存,以允许操作系统尝试将所有内容保留在物理内存中(请注意,应为操作系统和其他应用程序留出额外的物理内存空间) .

    对于这个问题:

    无法利用交换空间(虚拟内存)中额外的8GB并完成运行应用程序

    您已告诉JVM最多使用12 GB的内存,现在您希望JVM忽略您的订单并扩展到超过12 GB的内容? JVM是一个好人并且服从你,是你应该决定你是否更喜欢内存限制以确保良好的性能或没有堆限制和风险分页(当然,即使没有明确的限制,由于主机有限制机器操作系统和资源) .

    This link provides more information

  • 2

    JVM不应该只使用交换空间来完成计算,尽管速度很慢 .

    它不仅缓慢,如果你有旋转磁盘,它可以慢50,000多倍 . 执行GC时,它可以扫描GB / s的对象,但想象一下,它每秒只能扫描100个对象 . 这意味着现在需要大约一天,而不是花几秒钟 . 注意:发生这种情况时,机器将无法使用 . 在Windows上,您甚至无法终止进程并且必须重新启动它以使其停止 .

    如果我不提供任何-Xmx参数并让java应用程序运行,我是否能够测试它

    defualt只不过是主要的记忆 . 即使您将最大堆大小设置为大于主内存,也不意味着它将使用那么多,您也必须设置最小堆大小 .

    这可能是一个有趣的测试,看看你的过程是否成功完成,给定任何时间,但我希望它会花费更多的maginutde订单 .

相关问题