使用BufferedImage对象消耗大量内存

时间:2012-02-28 15:28:48

标签: java out-of-memory

我们一直在我们的应用程序中使用BufferedImage对象来渲染PNG图像,遗憾的是在执行某些操作之后,例如旋转和调整图像大小(反过来这些操作创建并返回具有更新长度和宽度的新BufferedImage对象)java堆大小越来越高,导致OutofMemory错误。

即使在关闭当前面板后GC没有回收这些BufferedImage对象消耗的内存,我已经阅读了很多线程,提到旧版本的JDK本身(1.5之前)在BufferedImage中有内存泄漏,但没有找到任何解决方法或解决此问题。即使在JDK的更高版本中,例如在运动中我们使用的是jdk1.6.0_26,但仍然可以看到这个问题。

如果有人可以通过BufferedImage对象或该对象的任何其他替代实现建议一些提示来阻止内存泄漏,那将会很棒吗?

2 个答案:

答案 0 :(得分:1)

您应该尝试使用AffineTransform方法Graphics2D(或任何其他采用AffineTransform对象的方法)使用drawImage

这些AffineTransform对象是变换矩阵,它们可以将所有图像操作保存在一个矩阵中,然后以1次变换为代价将该变换矩阵应用于图像。

您可以使用转换矩阵执行以下任何操作:

  • 翻译
  • 旋转
  • 尺度
  • 剪切

同样,每次应用转换时,您都不必构建新的BufferedImage。

答案 1 :(得分:-3)

我们在这里遇到同样的麻烦。我们使用了很多JChart实例,内存容易泄漏。

所有泄漏都发生在java.awt.image.BufferedImage

我们找到的解决方案是:

  • 删除案例中的对象引用BufferedImageobject.remove()object = null
  • 调用垃圾收集器System.gc()。这将真正释放你的记忆。

但GC的使用有点贵。

相关问题