Java JVM赢得';I don’我没有告诉你要用多少内存

Java JVM赢得';I don’我没有告诉你要用多少内存,java,memory,jvm,Java,Memory,Jvm,我正在运行一个内存密集型应用程序。有关环境的一些信息: 64位debian 13 GB内存 64位JVM(当我的程序运行时,我输出System.getProperty(“sun.arch.data.model”),它显示“64”) 下面是我发出的确切命令: java-Xmx9000m-jar“ale.jar”testconfig 我已经在其他几个系统上使用相同的精确数据、配置等运行了该程序,我知道JVM在这些系统上使用(峰值)6GB内存。然而,我得到了一个OutOfMemory错误。此外,在

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

  • 64位debian
  • 13 GB内存
  • 64位JVM(当我的程序运行时,我输出System.getProperty(“sun.arch.data.model”),它显示“64”)
下面是我发出的确切命令:

java-Xmx9000m-jar“ale.jar”testconfig

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

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

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


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

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

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

这是一种可能的解释

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

  • byte[]
    boolean[]
    。。。2G字节
  • char[]
    short[]
    。。。4G字节
  • int[]
    。。。8GB
  • long[]
    Object[]
    。。。16 GB字节
如果分配一个非常大的数组,GC需要找到一个所需大小的连续可用内存区域。根据数组大小以及堆空间如何划分为多个空间,它可能会找到比您想象的少得多的连续空间

第三种可能是,由于GC运行GC的时间达到了GC开销限制,所以您得到了OOME



如果你给我们看stacktrace,这些理论中的一些可能会被证实或者被否定

试试java-Xms9g-Xmx9g-jar[…],这对我来说很有效。您得到的完整异常消息是什么?stacktrace是什么?使用
-XX:+PrintGCDetails
查找实际的堆布局。