2010-10-06 80 views
0

我有一个程序,使用大量的图像。 它从文件中加载了很多图像,并将它们存储起来,因此只加载一次。 它还创建了多个BufferedImages,大约400x400,其中不会超过10个。Java图像占用太多内存

来自文件的图像总计大约6MB。 每个BufferedImage应该大约400x400x4 = 640KB。

但是,内存使用量是500MB!

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

有没有人知道该怎么办? 或使用较少内存的BufferedImage的替代方法?

+3

听起来很腥,我会在责怪图书馆之前责怪你的代码,对不起。小心粘贴一些?当你强制垃圾收集器运行时会发生什么?必须有一些Java可用的内存分析器。 http://www.google.com/#hl=en&expIds=17259,18168,26792,26885,27006&sugexp=ldymls&xhr=t&q=memory+profiler+java&cp=17&pf=p&sclient=psy&safe=off&aq=0&aqi=g4g-o1&aql=&oq = memory + profiler + j&gs_rfai =&pbx = 1&fp = 7c8f32f65b860aba – 2010-10-06 01:24:43

+0

同意Hamish,它可能是加载和缓存图像的代码中的一个错误。也许它实际上每次加载和缓存图像不止一次。 – 2010-10-06 01:26:08

+0

是的,最初我认为这是一个内存泄漏。但是一开始,最多的就是400x400 BufferedImages中的10个。开始时它是500MB,它似乎并没有从那里增长很多,它在开始时只是一个巨大的数额。 @Hamish我们试图强制垃圾收集器,但这并没有太多。当我有机会时,我会研究内存分析工具。至于粘贴代码,这将是不切实际的,因为它实际上是相当意大利面。我们正在为大学的一个团队项目开发一个冒险游戏,代码是一个完整的mess = s。 – DanielGibbs 2010-10-06 10:13:30

回答

4

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

编辑

现在你已经确定了有很多BufferedImages游逛,你需要做的下一件事就是找出为什么他们仍然到达。拿堆转储,看看一些实例,看看它们是如何连接到堆根的;请参阅http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/heapdump.html

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

+0

Steven,如何使用它?任何好的链接?谢谢。 – 2010-10-06 02:05:54

+1

从VisualVM开始http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/profiler.html ...或者在注释中查看上面提供的Google搜索结果。 – 2010-10-06 02:23:00

+0

谢谢!我没有意识到我的机器上一直都有这个...好像看起来BufferedImages是问题,我有206个= O。但是我的所有对象都没有提及它们中的大多数!所以他们似乎坚持在我完成他们后... – DanielGibbs 2010-10-06 10:55:17

1

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

在基于Web的应用程序中,我将使用CSS-Sprite图像来解决我的问题,因为它会中断多个HTTP请求并在加载时提高带宽使用率和内存使用率。

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

+0

这是一个正常的JRE程序。从文件加载的图像使用Toolkit.getDefaultToolkit()。createImage(imageName)。 BufferedImages是使用标准的BufferedImage构造函数创建的。不太确定你对图像精灵的意思,你有一个例子吗? – DanielGibbs 2010-10-06 10:16:44

+0

你可以看看这个网站的精灵技术的基于Web的版本:http://css-tricks.com/css-sprites/ 我还没有找到任何方法来实现这样的技术在一个基于JRE的计划,也许Stephen C的领导可能会有所帮助。 – LoganWolfer 2010-10-06 15:30:41