1

我正在尝试在 Java 中创建一个非常大的图像,如下所示:

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

显然图像非常大。

现在我遇到的问题是,它在某些计算机上似乎可以 100% 正常运行,但在其他计算机上运行速度却很慢(这与规格无关)。

我最大的突破来自 Eclipse,IDE 拒绝实际显示图像,而是在其中一台显示图像非常缓慢的计算机上抛出错误(调整图像大小等需要相当长的时间):

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

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

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

4

2 回答 2

7

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

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

可能你唯一要做的就是给应用程序更多的堆空间;这是通过-Xmx 命令行参数完成的。

于 2009-06-07T12:30:53.670 回答
2

问题在于 Java 虚拟机的堆大小——在抛出OutOfMemoryError.

如果运行 Sun JVM 的系统出现问题,则可以使用Sun 的 JVM 特定选项来更改 JVM 的堆大小。

从 Sun 的 Java 6 开始,堆大小的默认值由系统内存量决定,但也可以通过-Xms更改最小堆大小和-Xmx更改最大堆大小的选项来覆盖。默认情况下,最小堆大小是物理内存量的 1/64,最大值是物理内存量的 1/4。

于 2009-06-07T12:25:59.920 回答