我正在运行一个内存密集型应用程序。一些关于环境的信息:
下面是我发出的确切命令:
Java-xmx 9000m-jar " ale . jar " test config
我已经用同样精确的数据、配置等运行了程序。在其他几个系统上,我知道JVM在这些系统上使用(在其峰值)6 GB内存。然而,我得到了一个内存不足的错误。此外,在程序执行期间,系统的空闲内存从未低于8.5 GB。
当我输出Runtime.getRuntime()时。maxMemory()在执行期间,我得到值3044540416,即~3 GB。
我不知道这是否相关,但这是一个谷歌计算引擎实例。
我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。
-Xmx将只设置分配的最大内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用保持静态。
我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。
这是一种可能的解释。
另一个原因是您试图分配一个非常大的数组。最大的可能数组是2^31 - 1
元素,但实际大小取决于元素大小:
byte[]
或boolean[]
...2G字节char[]
或短[]
...4G字节int[]
...8 Gbyteslong[]
或Object[]
...16 Gbytes如果您分配了一个非常大的数组,GC需要找到所需大小的连续空闲内存区域。根据数组大小以及堆空间如何划分为多个空间,它可能会找到比您想象的少得多的连续空间。
第三种可能性是,您获得 OOME 是因为 GC 已达到运行 GC 所花费时间的 GC 开销限制。
如果您向我们展示堆栈跟踪,则可以确认或驳回其中一些理论......