使用BufferedImage创建非常大的图像文件,奇怪的问题取决于编译和计算机

时间:2009-06-07 12:20:12

标签: java image image-processing performance bufferedimage

我正在尝试用Java创建一个非常大的图像:

BufferedImage bi = new BufferedImage(58240,1664,BufferedImage.TYPE_INT_RGB);

显然图像非常大。

现在我遇到的问题是它似乎在某些计算机上运行良好100%但在其他计算机上运行得很慢(而且这与规格无关)。

我最重要的突破来自于Eclipse,IDE拒绝实际显示图像,而是在其中一台计算机上出现错误,这些计算机显示图像的速度非常慢(需要花费大量时间来调整图像大小等) :

线程“AWT-EventQueue-0”中的异常java.lang.OutOfMemoryError:Java堆空间

该错误的另一个有趣的元素是,即使在计算机上它运行缓慢,我也可以调整窗口的大小,直到不再调用绘制函数,然后再次使其变大,如果我这样做“正确”它以100%的速度运行。

不知道发生了什么,有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您的应用内存不足 - 如果我正确计算,该图片大约需要280MB。

Java程序拥有允许使用的最大内存量(堆空间),这在JVM启动时是固定的,并且设置此限制的方式因JVM实现和版本而异。当您的内存不足或接近极限时,JVM将花费大量时间进行垃圾收集,这会大大减慢垃圾收集速度。

可能你唯一需要做的就是为应用程序提供更多的堆空间;这是通过-Xmx command line parameter完成的。

答案 1 :(得分:2)

问题在于Java虚拟机的堆大小 - 在推出OutOfMemoryError的系统上还不够。

如果运行Sun JVM的系统出现问题,则可以使用Sun's JVM-specific options更改JVM的堆大小。

从Sun的Java 6开始,default values for the heap size is determined by the amount of system memory,但也可以通过更改最小堆大小的-Xms选项和更改最大堆大小的-Xmx来覆盖。默认情况下,最小堆大小是物理内存量的1/64,最大值是物理内存量的1/4。