我们一直在应用程序中使用BufferedImage对象来呈现PNG映像,不幸的是,在执行了某些操作(例如旋转和调整映像大小后,这些操作创建并返回具有更新长度和宽度的新BufferedImage对象),java堆大小会越来越高,从而导致OutofMemory错误。
即使在关闭当前面板GC没有回收这些BufferedImage对象所消耗的内存之后,我也读过很多线程,提到JDK本身(1.5之前)的旧版本在BufferedImage中出现内存泄漏,但没有找到任何工作或修复。例如,即使在JDK的后期版本中,我们也在使用jdk1.6.0_26,并且仍然能够看到这个问题。
如果有人能建议一些技巧来阻止BufferedImage对象或该对象的任何其他替代实现的内存泄漏,那就太好了。
发布于 2012-05-04 07:18:58
您应该尝试将 AffineTransform 与 Graphics2D 方法 drawImage (或任何其他接受AffineTransform对象的方法)一起使用。
这些AffineTransform对象是转换矩阵,它们可以将所有图像操作保存在一个矩阵中,然后将该转换矩阵应用于图像,而代价是1转换。
您可以使用转换矩阵做四件事中的任何一件事:
同样,在每次应用转换时,您都不必构建一个新的BufferedImage。
发布于 2013-04-12 13:53:27
我们在这里也遇到了同样的麻烦。我们使用了大量的JChart实例,内存很容易泄漏。
所有泄漏都发生在 java.awt.image.BufferedImage 中。
java.awt.image.BufferedImage
我们找到的解决办法是:
BufferedImage
object.remove()
object = null
System.gc()
但是GC的使用有点贵。
https://stackoverflow.com/questions/9484749