繁体   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