如果堆大小低于最大值,JVM(Oracle)是否会出现 OutOfMemory 错误?

如果堆大小低于最大值,JVM(Oracle)是否会出现 OutOfMemory 错误?

我正在运行一个 Tomcat 站点(带有 NGinx 前端),尽管最大堆大小相当大,但似乎会随机耗尽内存。我的问题是,即使堆大小明显小于 -Xmx,JVM 是否也有可能出现 OutOfMemory 错误?例如,这是我在 OutOfMemory 错误发生前 15 秒拍摄的快照:

2012 年 12 月 18 日星期二 23:13:28 JST 可用内存:162.31 MB 总内存:727.75 MB 最大内存:3808.00 MB

我猜理论上我的代码可能在 15 秒内生成了 3 GB 的对象,但我对此非常怀疑。似乎 JVM 无法增加堆,尽管理论上堆有空间……是否有可能其他进程开始使用内存,以至于 JVM 无法增加?我在运行 CentOS 5 的 64 位虚拟机上运行 64 位 Oracle Hotspot,内存为 6 GB。

答案1

Java 中有许多不同的内存池,因此即使你有足够的堆大小,你仍然可能会耗尽内存。以下是我在其他 Java 站点上使用过的几个其他设置的摘录,你可以自己尝试一下。我建议你也查阅 Java 文档。

 .
 .
 .
 export JAVA_OPTS=" -XX:PermSize=32m -XX:MaxPermSize=512m ${JAVA_OPTS}"
 export JAVA_OPTS=" -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8 ${JAVA_OPTS}"
 .
 .
 .

答案2

您发布的相关部分是:

可用内存:162.31 MB

您的代码可能在 15 秒内生成了价值 162 MB 的对象。

另外,您说您有一个“OutOfMemoryError”,但没有列出堆空间不足作为您遇到该错误的实际原因,所以是的,其他进程很可能在 JVM 获取内存之前使用了内存。

您可能已经解决了这个问题,但对于可能遇到此问题的后代,您可能希望在问题中指定您的 JVM 设置。 可能为堆保留了太多内存,但对 JVM 的其他部分或其他服务器进程来说却不够,但如果没有这些信息,我们只能猜测。

相关内容