为什么(Oracle)JVM有固定的内存使用上限(-Xmx)?
本着对Java:为什么存在MaxPermSize?的精神,我想问为什么Oracle JVM对其内存分配池的大小使用固定的上限。
默认值为物理RAM的1/4(上限和下限);因此,如果您有一个内存密集型应用程序,则必须手动更改限制(参数-Xmx),否则您的应用程序将表现不佳,甚至可能因OutOfMemoryError而崩溃。
为什么这个固定的限制甚至存在?为什么 JVM 不像大多数操作系统上的本机程序那样根据需要分配内存?
这将解决Java软件的一整类常见问题(只需Google查看网络上有多少提示通过设置-Xmx来解决问题)。
编辑:
一些答案指出,这将保护系统的其余部分免受Java程序的失控内存泄漏;如果没有限制,这将通过耗尽所有内存来使整个系统崩溃。这是事实。但是,对于任何其他程序也是如此,现代操作系统已经允许您限制程序的最大内存(Linux ulimit,Windows“Job Objects”)。因此,这并没有真正回答这个问题,即“为什么JVM与大多数其他程序/运行时环境不同?