【发布时间】:2017-08-13 16:26:05
【问题描述】:
我正在制作一个 Java 程序。 它涉及制作尺寸高达 9933 * 14043 像素(即 A0 尺寸和 300 ppi)的图像。图像是 24 位的,所以它会占用大约 400mb 的空间。 BufferedImage 类如何占用比位图的实际大小更多的 RAM,因此图像将占用大约 600 mb 的 RAM。 使用其他数据,该应用程序在渲染大图像时最多需要大约 700 mb 的内存。到目前为止,我还没有遇到任何问题。但是,如果最终用户没有足够的可用内存,JVM 将无法为位图分配内存并抛出 OutOfMemoryError。
那我该怎么办?
我想出了一个办法:
- 捕捉错误并向用户抛出提示。
- 等待一段时间,直到这里有足够的内存。如果等待时间过长,则抛出提示。
- 编写我自己的位图类,并使用 FileOutputStream 逐部分写入图像。 .bmp 格式并不是很复杂。 (实际上我已经编写并优化了大部分内容。)通过部分渲染位图,整个图像不必留在 RAM 中。可以根据可用内存大小动态更改部件的大小。然而,这是一种重新发明轮子,需要大量的工作。此外,涉及文本的图像部分必须放入 BufferedImage 中,然后转换为我的类(因为我不想查看真正的字体格式)。无论如何,如果 Java BufferedImage 类在我的情况下工作,我不会这样下去。
【问题讨论】:
-
使用
-Xmx标志来增加内存限制有什么问题吗? -
从 OutOfMemoryError 中恢复是不可靠的。所以一段时间后重试可能会产生意想不到的结果。
-
等待一段时间,我的意思是使用 Runtime.freeMemory() 方法查找空闲内存,直到可用内存量大于所需内存。
-
700MB 也不算多,真的有问题吗?
-
我怀疑现在任何人的内存不足。因此,您可以使用
Runtime.getRuntime().maxMemory()检查用户是否有足够的内存,以及他们是否不只是显示错误并关闭。