我正在运行一个内存密集型应用程序。关于环境的一些信息:
以下是我发出的确切命令:
java -Xmx9000m -jar "ale.jar“testconfig
我在其他几个系统上运行了相同的精确数据、配置等程序,并且我知道JVM在这些系统上使用了6GB的内存。但是,我得到了一个OutOfMemory错误。此外,在程序执行过程中,系统从不会掉落到8.5GB以下的空闲内存。
当我在执行过程中输出Runtime.getRuntime().maxMemory()时,我得到了值3044540416,即~3GB。
我不知道它是否相关,但这是一个Google引擎实例。
我唯一能想到的解释是,对于单个进程可能使用的最大内存量,可能存在某种系统限制。
发布于 2014-06-29 07:48:07
-Xmx将只设置指定的最大内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用保持静态。
发布于 2014-06-29 07:48:16
我唯一能想到的解释是,对于单个进程可能使用的最大内存量,可能存在某种系统限制。
这是一个可能的解释。
另一个原因是,您正在尝试分配一个非常大的数组。最大可能的数组是2^31 - 1元素,但实际大小取决于元素大小:
byte[]或boolean[] . 2G字节char[]或short[] . 4G字节int[] .8 Gbyteslong[]或Object[] . 16 or如果您分配了一个非常大的数组,GC需要找到一个具有所需大小的空闲内存的连续区域。取决于数组大小,以及堆空间如何划分为空格,它可能会发现比您想象的少得多的连续空间。
第三种可能是,您正在获得OOME,因为GC达到了运行GC所花费的时间的GC开销限制。
如果你给我们看堆栈痕迹,这些理论可能会被证实或驳回.
https://stackoverflow.com/questions/24474008
复制相似问题