0

我有一个使用大量图像的程序。它从文件中加载大量图像,并存储它们,因此它们只加载一次。它还会创建多个 BufferedImage,大约 400x400,其中不会超过 10 个。

文件中的图像总大小约为 6MB。每个 BufferedImage 应约为 400x400x4=640KB。

然而,内存使用量是 500MB!

其中一些将用于程序的其余部分,但我很确定图像占用了大部分空间。

有谁知道该怎么做?还是使用更少内存的 BufferedImage 的替代品?

4

2 回答 2

4

在我看来,您的应用程序(而不是库)有内存泄漏。在第一种情况下,您应该尝试使用标准 Java 内存分析器来识别泄漏。

编辑

现在您已经确定有很多BufferedImages闲逛,接下来您需要做的是弄清楚为什么它们仍然可以到达。进行堆转储,查看一些实例,看看它们是如何连接到堆根的;请参阅http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/heapdump.html

在做这类事情时,使用您最喜欢的 Java IDE 查看 Java 源代码的相关部分很有用。

于 2010-10-06T01:39:43.187 回答
1

您的程序是 Web 应用程序吗?或者您正在开发类似 JRE 的应用程序?你如何加载你的图像?

在基于 Web 的应用程序中,我会使用 CSS-Sprite 图像来解决我的问题,因为它会切断几个 HTTP 请求并改善带宽使用和负载时的内存使用。

在 JRE 应用程序中,应该有一种以相同方式使用图像精灵的方法,加载图像精灵的 400x400 偏移量以减少 BufferedImage 对象的使用并提高性能。

于 2010-10-06T01:31:10.050 回答