java应用程序中的缓冲图像问题

Posted

技术标签:

【中文标题】java应用程序中的缓冲图像问题【英文标题】:Buffered image issue within java application 【发布时间】:2015-09-10 15:06:29 【问题描述】:

我想实例化一个 BufferedImage 类,所以我添加了这个 sn-p

BufferedImage bufferedImage = new BufferedImage(7232, 7204, BufferedImage.TYPE_INT_RGB);

但我得到一个奇怪的异常

java.lang.OutOfMemoryError: Java 堆空间

所以我需要知道:

我该如何解决?

【问题讨论】:

"当 Java 虚拟机因为内存不足而无法分配对象并且垃圾收集器无法提供更多内存时抛出。OutOfMemoryError 对象可能由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写。” -- docs.oracle.com/javase/7/docs/api/java/lang/… 可能是因为您试图为 7232x7204 图像分配内存而它没有内存? @MarcoAcierno :谢谢,但是我该如何解决这个问题? 【参考方案1】:

您需要确保以足够的堆空间启动运行该程序的 JVM。命令行选项 -Xmx 设置 jvm 可用的最大堆数量。例如: java -Xmx 2048m

有不同的方法来设置这个参数,取决于你如何启动程序。如果您直接从命令行启动,则上述方法有效,但如果您使用的是 IDE(例如 Eclipse),则可能需要查看“运行”或“启动”配置。

但是,您可以为 jvm 提供的堆空间量是有限制的,由您的机器的系统属性(硬件约束)定义。

另请参阅How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size) 进行深入讨论。

编辑: BufferedImage 似乎将位图加载到内存中,这可以使您的应用程序真正快速地占用内存。如果您想在渲染之前操作图像,这很好,但如果您只想显示图像,则可能有点矫枉过正。 我在 Java 中处理图像的经验非常有限,而且我不知道有任何类可以在处理图像时降低内存消耗,但Make a BufferedImage use less RAM? 提出了一个解决方案,在读取图像时缩小图像大小,这样你的 BufferedImages 使用更少的内存。我不知道它是否有效,但它可能会为您指明正确的方向。

附: Google 在大多数问题上都是你的朋友;-)

【讨论】:

谢谢@Buurman,我试过了,它可以工作,但是我的机器变得很慢,并且在客户端机器上不能保证结果。是否有另一个可以用来代替bufferedImage 的类来解决这个问题? @LamloumiAfif 我在 SO 上发现了一个类似的问题,并附上了我的答案。

以上是关于java应用程序中的缓冲图像问题的主要内容,如果未能解决你的问题,请参考以下文章

applet 中的双缓冲是如何工作的?

空白图像(帧缓冲区)

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

从缓冲区读取字节(字符)

在 Java 中旋转缓冲图像

Java 灰度缓冲图像