初始化Array时出错:OutOfMemoryError

时间:2012-03-30 04:57:35

标签: java out-of-memory

我必须根据配置参数的高度和宽度为数组int input[]分配空间。

int input[]=new int[height * width]; //this is line no 538

其中一个配置包含参数height=8192width=8192。因此,数组的大小变为67108864。但是当我这样做时,我得到OutOfMemoryError。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at Test.main(Test.java:538)

我已经在eclipse以及cygwin上运行了这个程序,但我遇到了同样的问题。我认为这不是错误,也不是例外。我怎么能纠正这个?

6 个答案:

答案 0 :(得分:5)

由于8192 * 8192 * 4 = 256 M(整数各为4个字节),因此矩阵本身使用256 MB的堆空间。

您可以告诉JVM应用程序可以使用多少堆空间。从运行man java并查看非标准选项:

  

-Xmxn

            Specify the maximum size, in bytes, of the memory allocation
            pool. This value must a multiple of 1024 greater than 2MB.
            Append the letter k or K to indicate kilobytes, or m or M to
            indicate megabytes. The default value is chosen at runtime
            based on system configuration. For more information, see
            HotSpot Ergonomics
            Examples:

                   -Xmx83886080
                   -Xmx81920k
                   -Xmx80m

         On Solaris 7 and Solaris 8 SPARC platforms, the upper limit for
         this value is approximately 4000m minus overhead amounts. On
         Solaris 2.6 and x86 platforms, the upper limit is approximately
         2000m minus overhead amounts. On Linux platforms, the upper limit
         is approximately 2000m minus overhead amounts.

要使用此选项,您可以使用

之类的命令启动应用程序
java -Xmxn1024m -jar foo.jar

在Eclipse中,您也可以添加命令行选项。 eclipse.org上的This page描述了如何向Java程序添加命令行参数。您应该将-Xmxn1024m(或其他足够大的堆规范)添加到该站点上显示的对话框的“VM参数”部分。

答案 1 :(得分:1)

您可能只有太少的堆空间来容纳您要定位的大小的数组。您可以使用命令行开关增加堆的大小。例如,要将其设置为256MB,请包含此开关:

  

-Xmx256m

如果乘以height * width * 4(4是int的存储空间),您可以粗略估计所需的堆数,假设程序的其余部分不需要大量数据。你肯定需要比快速计算建议更多的堆。额外增加20%,然后试试。

要获得比经验法则更好的数字,您可以查看堆分析器。有几个开源选项:

http://java-source.net/open-source/profilers

有关Java中堆的详细讨论,请参阅http://javarevisited.blogspot.com/2011/05/java-heap-space-memory-size-jvm.html

答案 2 :(得分:1)

通过添加此标志来增加堆,增加Java进程的内存参数。您可能需要四处寻找以获得堆的最佳大小。这将设置“最大”堆大小。默认值可能非常小。 64M是许多Java EE容器的常见最大大小。

*注意我并不是说这正是你需要的尺寸。您的独特案例将决定您可能需要尝试的尺寸。

 -Xmx256M

答案 3 :(得分:1)

内存对你的程序来说还不够,可能是那里的内存泄漏。

你可以尝试下面,如果不解决尝试增加jmx值。

java -xmx1g -xms512m

答案 4 :(得分:1)

取决于JVM有多少堆。如果在命令行上运行它,请尝试添加-Xmx512m。如果您在IDE中工作,请将其添加到“运行”属性。

答案 5 :(得分:1)

int是32位(即4字节)。所以你的阵列需要8192 * 8192 * 4字节。这个是256MB。

使用默认参数调用的Java只有64MB的堆空间。

要获得更大的堆,请使用-Xmx参数(最大内存大小)调用Java。

e.g。 java -Xmx300M