Java BuffereImage对象内存消耗高
我们一直在应用程序中使用BuffereImage对象来渲染PNG图像,不幸的是,在执行了某些操作(如旋转和调整图像大小)之后(这些操作反过来创建并返回具有更新长度和宽度的新BuffereImage对象)java堆大小越来越大,导致OutofMemory错误 即使在关闭当前面板后,GC也没有回收这些BuffereImage对象所消耗的内存,我读过很多线程,其中提到JDK的旧版本(1.5之前)在BuffereImage中存在内存泄漏,但没有找到任何解决方法或修复方法。即使在JDK的更高版本中,例如在movement中,我们也使用jdk1.6.0_26,并且仍然能够看到这个问题Java BuffereImage对象内存消耗高,java,out-of-memory,Java,Out Of Memory,我们一直在应用程序中使用BuffereImage对象来渲染PNG图像,不幸的是,在执行了某些操作(如旋转和调整图像大小)之后(这些操作反过来创建并返回具有更新长度和宽度的新BuffereImage对象)java堆大小越来越大,导致OutofMemory错误 即使在关闭当前面板后,GC也没有回收这些BuffereImage对象所消耗的内存,我读过很多线程,其中提到JDK的旧版本(1.5之前)在BuffereImage中存在内存泄漏,但没有找到任何解决方法或修复方法。即使在JDK的更高版本中,例如在
如果有人能建议一些技巧来阻止BuffereImage对象或该对象的任何其他替代实现的内存泄漏,那将是非常棒的 您应该尝试仅使用方法(或采用仿射Transform对象的任何其他方法) 这些仿射变换对象是变换矩阵,它们可以将所有图像操作保留在一个矩阵中,然后以1次变换为代价将该变换矩阵应用于图像 您可以使用转换矩阵执行以下四项操作之一:
- 翻译
- 轮换
- 鳞片
- 剪
同样这样,您不必每次应用转换时都构造一个新的BuffereImage。我们也遇到了同样的问题。我们使用了大量JChart实例,内存很容易泄漏 所有泄漏都发生在
java.awt.image.buffereImage
中
我们找到的解决方案是:
- 在您的案例中删除对象引用
buffereImage
或object.remove()
object=null
- 调用垃圾收集器
。这将真正解放你的记忆System.gc()
但是GC的使用有点昂贵。可能一段代码被剪断,可以用来重现问题会有所帮助。另外,您运行的jvm选项也会有所帮助。
buffereImage
本身不太可能是问题的根本原因。使用VisualVM之类的工具运行程序,以发现真正的问题在哪里()@user1238131:您应该确保刷新()BuffereImage。将引用设置为null(或对另一个映像重用ref)是不够的:您也应该首先调用flush()。这里的答案是错误的顺便说一句:它说你从来没有被迫冲水。但事实并非如此:目前有一些JVM(例如,在较旧的OS X版本上——今天仍有很多人在使用),不使用flush()会造成泄漏。我不是说flush()可以解决你所有的问题,但它可能会有帮助…@user1238131代码在哪里?停止使用隐形墨水;)首先,如何获取Graphics2D对象?此外,调用System.gc不会消除内存泄漏。