java - BufferedImage 对象的高内存消耗

标签 java out-of-memory

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

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

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

最佳答案

你应该尝试只使用 AffineTransformGraphics2D方法 drawImage (或任何其他采用 AffineTransform 对象的对象)。

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

你可以用转换矩阵做四件事中的任何一件:

  • 翻译
  • 轮换
  • 规模
  • 剪切

同样,通过这种方式,您不必在每次应用转换时都构造一个新的 BufferedImage。

关于java - BufferedImage 对象的高内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484749/

相关文章:

尽管使用了 java.NIO,但 Java Websockets 的可扩展性很差

java - 如何从 PhoneStateListener 类获取上下文

android - 内存不足

java - 微小的图像,没有旋转,但仍然得到 OutOfMemoryError : bitmap size exceeds VM budget

Java 反射与抽象类

java - 检测 UPDATE 语句中哪些 SQL 列发生了更改

java - JSF 与 EL 表达的困难

Java OutOfMemoryError 奇怪的行为

android - java.lang.OutOfMemoryError : Could not allocate JNI Env 错误

java - tomcat 在内存不足错误时不生成 hprof 文件