2012-03-30 42 views
0

根据配置参数的高度和宽度,我必须为数组int input[]分配空间。初始化Array时出错:OutOfMemoryError

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上运行这个程序,但我面临同样的问题。我认为这不是一个错误,也不是例外。我该如何纠正这一点?

+0

什么是你的java运行配置?发生OutOfMemoryError的行并不重要。 – Markus 2012-03-30 05:00:28

+1

请参阅我的评论[此问题](http://stackoverflow.com/a/9937250/1251613) – Markus 2012-03-30 05:05:49

回答

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

1

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

*注意我并不是说这完全是您需要的尺寸。您的独特情况会决定您需要的尺寸,您可能需要进行试验。

-Xmx256M 
+1

他需要多一点。 67108864'int's自己占用256M。 – trutheality 2012-03-30 05:06:46

+0

我通过编辑澄清了我的答案。由于我们只知道一个他需要记忆的数组,因此无法给出“确定的”答案。除非他的计划只使用那个阵列,否则他需要自己弄清楚他需要什么尺寸。 – DavidB 2012-03-30 05:18:54

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参数”部分。

+0

也许另一个有用的[答案](http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb-heap) – Markus 2012-03-30 05:04:46

1

内存不足以满足您的程序,可能是内存泄漏。

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

java -xmx1g -xms512m 
1

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

1

int是32位(即4个字节)。所以你的数组需要8192 * 8192 * 4个字节。这出来在256MB。

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

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

例如java -Xmx300M