JVM不会像我告诉的那样使用尽可能多的内存

时间:2014-06-29 07:28:44

标签: java memory jvm

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

  • 64位debian
  • 13 GB的RAM
  • 64位JVM(我的程序运行时输出System.getProperty(“sun.arch.data.model”),并显示“64”)

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

java -Xmx9000m -jar“ale.jar”testconfig

我在其他几个系统上使用相同的精确数据,配置等运行程序,我知道JVM在这些系统上使用(最高峰值)6 GB的内存。但是,我收到OutOfMemory错误。此外,在执行程序期间,系统永远不会低于8.5 GB的可用内存。

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

我不知道它是否相关,但这是Google Compute Engine实例。

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

2 个答案:

答案 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开销限制。


如果你向我们展示了堆栈跟踪,这些理论中的一些可以得到证实或驳回......