【发布时间】:2010-10-06 01:21:32
【问题描述】:
我有一个使用大量图像的程序。 它从文件中加载大量图像,并存储它们,因此它们只加载一次。 它还会创建多个 BufferedImage,大约 400x400,不会超过 10 个。
文件中的图像总大小约为 6MB。 每个 BufferedImage 应约为 400x400x4=640KB。
但是,内存使用量是 500MB!
其中一些将用于程序的其余部分,但我很确定图像占据了大部分空间。
有人知道该怎么办吗? 还是使用更少内存的 BufferedImage 的替代品?
【问题讨论】:
-
听起来很可疑,在我责怪库之前,我会先责怪你的代码,抱歉。小心粘贴一些吗?当你强制垃圾收集器运行时会发生什么?必须有一些可用的 java 内存分析器。 google.com/…
-
同意 Hamish,这可能是加载和缓存图像的代码中的错误。也许它实际上不止一次地加载和缓存图像。
-
是的,最初我认为这是内存泄漏。但是一旦开始,最多只能制作 10 个 400x400 的 BufferedImage。一开始它是 500MB,从那里看起来并没有增长多少,一开始只是一个巨大的数量。 @Hamish我们尝试强制垃圾收集器,但这并没有做太多。当我有机会时,我会研究内存分析工具。至于粘贴代码,这将是相当不切实际的,因为它实际上是相当意大利面条式的。我们正在为大学的一个小组项目开发一款冒险游戏,代码完全是一团糟=s。
-
@DaniEL,你怎么知道是图片导致了这个问题?如果您不小心,您可以轻松创建千兆字节的数据。例如,如果您尝试解决 TSP 问题,内存和 CPU 使用率可能会呈指数级增长。您需要进行分析以找出实际的瓶颈。
-
我刚刚玩过 jvisualvm,出于某种荒谬的原因,我实际上确实有 206 个 BufferedImages。但奇怪的是,对于它们中的大多数,我的对象都没有引用它们。在分析器中对它们的唯一引用是 biimage、referent、bImg、bufImg 和类似的东西。这些都不是我的代码的一部分。知道为什么他们仍然有参考吗?或者如何摆脱它们?
标签: java image memory bufferedimage