Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BuffereImage对象内存消耗高_Java_Out Of Memory - Fatal编程技术网

Java BuffereImage对象内存消耗高

Java BuffereImage对象内存消耗高,java,out-of-memory,Java,Out Of Memory,我们一直在应用程序中使用BuffereImage对象来渲染PNG图像,不幸的是,在执行了某些操作(如旋转和调整图像大小)之后(这些操作反过来创建并返回具有更新长度和宽度的新BuffereImage对象)java堆大小越来越大,导致OutofMemory错误 即使在关闭当前面板后,GC也没有回收这些BuffereImage对象所消耗的内存,我读过很多线程,其中提到JDK的旧版本(1.5之前)在BuffereImage中存在内存泄漏,但没有找到任何解决方法或修复方法。即使在JDK的更高版本中,例如在

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

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


如果有人能建议一些技巧来阻止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不会消除内存泄漏。