我们一直在我们的应用程序中使用BufferedImage对象来渲染PNG图像,遗憾的是在执行某些操作之后,例如旋转和调整图像大小(反过来这些操作创建并返回具有更新长度和宽度的新BufferedImage对象)java堆大小越来越高,导致OutofMemory错误。
即使在关闭当前面板后GC没有回收这些BufferedImage对象消耗的内存,我已经阅读了很多线程,提到旧版本的JDK本身(1.5之前)在BufferedImage中有内存泄漏,但没有找到任何解决方法或解决此问题。即使在JDK的更高版本中,例如在运动中我们使用的是jdk1.6.0_26,但仍然可以看到这个问题。
如果有人可以通过BufferedImage对象或该对象的任何其他替代实现建议一些提示来阻止内存泄漏,那将会很棒吗?
答案 0 :(得分:1)
您应该尝试使用AffineTransform方法Graphics2D(或任何其他采用AffineTransform对象的方法)使用drawImage。
这些AffineTransform对象是变换矩阵,它们可以将所有图像操作保存在一个矩阵中,然后以1次变换为代价将该变换矩阵应用于图像。
您可以使用转换矩阵执行以下任何操作:
同样,每次应用转换时,您都不必构建新的BufferedImage。
答案 1 :(得分:-3)
我们在这里遇到同样的麻烦。我们使用了很多JChart实例,内存容易泄漏。
所有泄漏都发生在java.awt.image.BufferedImage
。
我们找到的解决方案是:
BufferedImage
。 object.remove()
或object = null
System.gc()
。这将真正释放你的记忆。但GC的使用有点贵。