提问者:小点点

JVM不会像我说的那样使用那么多内存


我正在运行一个内存密集型应用程序。一些关于环境的信息:

  • 64位debian
  • 13 GB RAM
  • 64位JVM(我的程序运行时输出System.getProperty("sun.arch.data.model"),它说"64")

下面是我发出的确切命令:

Java-xmx 9000m-jar " ale . jar " test config

我已经用同样精确的数据、配置等运行了程序。在其他几个系统上,我知道JVM在这些系统上使用(在其峰值)6 GB内存。然而,我得到了一个内存不足的错误。此外,在程序执行期间,系统的空闲内存从未低于8.5 GB。

当我输出Runtime.getRuntime()时。maxMemory()在执行期间,我得到值3044540416,即~3 GB。

我不知道这是否相关,但这是一个谷歌计算引擎实例。

我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。


共2个答案

匿名用户

-Xmx将只设置分配的最大内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用保持静态。

匿名用户

我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。

这是一种可能的解释。

另一个原因是您试图分配一个非常大的数组。最大的可能数组是2^31 - 1元素,但实际大小取决于元素大小:

  • byte[]boolean[]...2G字节
  • char[]短[]...4G字节
  • int[]...8 Gbytes
  • long[]Object[]...16 Gbytes

如果您分配了一个非常大的数组,GC需要找到所需大小的连续空闲内存区域。根据数组大小以及堆空间如何划分为多个空间,它可能会找到比您想象的少得多的连续空间。

第三种可能性是,您获得 OOME 是因为 GC 已达到运行 GC 所花费时间的 GC 开销限制。

如果您向我们展示堆栈跟踪,则可以确认或驳回其中一些理论......