2012-03-30 44 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