我正在运行内存密集型应用程序。有关环境的一些信息:
以下是我发出的确切命令:
java -Xmx9000m -jar“ale.jar”testconfig
我在其他几个系统上使用相同的精确数据,配置等运行程序,我知道JVM在这些系统上使用(最高峰值)6 GB的内存。但是,我收到OutOfMemory错误。此外,在执行程序期间,系统永远不会低于8.5 GB的可用内存。
当我在执行期间输出Runtime.getRuntime()。maxMemory()时,我得到值3044540416,即~3 GB。
我不知道它是否相关,但这是Google Compute Engine实例。
我能想到的唯一解释是,单个进程可能使用的最大内存量可能存在某种系统限制。
答案 0 :(得分:1)
-Xmx仅设置最大分配的内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用空间不变。
答案 1 :(得分:1)
我能想到的唯一解释是,单个进程可能使用的最大内存量可能存在某种系统限制。
这是一种可能的解释。
另一个是你试图分配一个非常大的数组。最大可能的数组是2^31 - 1
元素,但实际大小取决于元素大小:
byte[]
或boolean[]
... 2G字节char[]
或short[]
... 4G字节int[]
... 8 GB long[]
或Object[]
... 16 Gbytes 如果分配一个非常大的数组,GC需要找到所需大小的连续可用内存区域。根据数组大小以及堆空间如何拆分为空格,它可能找到比您想象的更少的连续空间。
第三种可能性是您获得OOME,因为GC在运行GC时花费了GC开销限制。
如果你向我们展示了堆栈跟踪,这些理论中的一些可以得到证实或驳回......