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

Rag*_*ava 3 java jvm heap-memory virtual-memory

正如了解JVM 内存分配和 Java 内存不足:堆空间 中所述,分配堆空间时,JVM 不区分物理内存和虚拟内存。当java对象的内存分配和计算开始发生时,JVM开始区分虚拟内存和物理内存。如果有足够的交换空间(在 Linux 机器上),为什么会发生内存不足错误?JVM 不应该简单地使用交换空间来完成计算吗?尽管速度很慢。

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

如果一个java应用程序需要20GB的空间,它不能利用交换空间(虚拟内存)来完成应用程序的运行吗?

对于 Java 应用程序来说,堆空间和虚拟内存之间的相互作用是什么?

SJu*_*n76 5

进程永远不知道它们使用的内存的哪些部分在虚拟内存中,哪些部分在物理内存中。

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

要使用某块内存,您必须拥有该块内存在物理内存中的页面。将一页内存从虚拟内存移至物理内存的成本非常高,因此必须尽量避免这样做。因此,您通常指定堆小于物理内存,以允许操作系统尝试将所有堆保留在物理内存中(请注意,您应该为操作系统和其他应用程序留出额外的物理内存)。

对于这个问题:

它不能利用交换空间(虚拟内存)中的额外 8GB 来完成应用程序的运行吗

您已经告诉 JVM 最多使用 12 GB 内存,现在您希望 JVM 忽略您的命令并扩展到 12 GB 之外?JVM 是个好人,听你的,你应该决定是否选择内存限制以确保良好的性能,还是选择无堆限制和风险分页(当然,即使没有明确的限制,由于主机的原因也会有限制)机器操作系统和资源)。

此链接提供更多信息