我必须根据配置参数的高度和宽度为数组int input[]
分配空间。
int input[]=new int[height * width]; //this is line no 538
其中一个配置包含参数height=8192
和width=8192
。因此,数组的大小变为67108864
。但是当我这样做时,我得到OutOfMemoryError。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Test.main(Test.java:538)
我已经在eclipse以及cygwin上运行了这个程序,但我遇到了同样的问题。我认为这不是错误,也不是例外。我怎么能纠正这个?
答案 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