簡體   English   中英

初始化Array:OutOfMemoryError時出錯

[英]Error while initializing Array:OutOfMemoryError

我必須根據配置參數的高度和寬度為數組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上運行了該程序,但是我面臨着同樣的問題。 我認為這不是錯誤,也不是例外。 我該如何糾正?

由於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上的此頁面描述了如何向Java程序添加命令行參數。 您應將-Xmxn1024m (或其他足夠大的堆規范)添加到該站點上顯示的對話框的“ VM arguments”部分。

您的堆空間可能太少,無法容納要定位的大小的數組。 您可以使用命令行開關來增加堆的大小。 例如,要將其設置為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

通過添加此標志來增加堆,可以增加Java進程的內存參數。 您可能需要四處摸索以獲得堆的最佳大小。 這將設置“最大”堆大小。 默認值可能很小。 64M是許多Java EE容器的常見最大大小。

*請注意,我並不是說這正是您需要的尺寸。 您的情況會決定您需要的尺寸,您可能需要嘗試使用該尺寸。

 -Xmx256M

程序內存不足,可能是那里的內存泄漏。

您可以嘗試以下方法,如果無法解決,請嘗試增加jmx值。

java -xmx1g -xms512m

取決於JVM有多少堆。 如果您在命令行上運行它,請嘗試添加-Xmx512m。 如果在IDE中工作,請將其添加到“運行”屬性。

一個int是32位(即4個字節)。 因此,您的數組需要8192 * 8192 * 4個字節。 出來的是256MB。

使用默認參數調用的Java只有64MB的堆空間。

要獲得更大的堆,請使用-Xmx參數(最大內存大小)來調用Java。

例如java -Xmx300M

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM