我们一直在我们的应用程序中使用 BufferedImage 对象来呈现 PNG 图像,不幸的是,在执行某些操作(例如旋转和调整图像大小)之后(这些操作反过来创建并返回具有更新的长度和宽度的新 BufferedImage 对象)java 堆大小越来越高导致 OutofMemory 错误。
即使在关闭当前面板后 GC 也没有回收这些 BufferedImage 对象消耗的内存,我读过很多线程提到旧版本的 JDK 本身(1.5 之前)在 BufferedImage 中有内存泄漏,但没有找到任何解决方法或解决此问题。即使在 JDK 的更高版本中,例如在我们使用 jdk1.6.0_26 的 movement 中,仍然能够看到这个问题。
如果有人可以提出一些技巧来阻止 BufferedImage 对象或该对象的任何其他替代实现的内存泄漏,那将会很棒吗?
最佳答案
你应该尝试只使用 AffineTransform与 Graphics2D方法 drawImage (或任何其他采用 AffineTransform 对象的对象)。
这些 AffineTransform 对象是变换矩阵,它们可以将所有图像操作保存在一个矩阵中,然后以 1 次变换为代价将该变换矩阵应用于图像。
你可以用转换矩阵做四件事中的任何一件:
- 翻译
- 轮换
- 规模
- 剪切
同样,通过这种方式,您不必在每次应用转换时都构造一个新的 BufferedImage。
关于java - BufferedImage 对象的高内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484749/