我有一个使用大量图片的程序。 它从文件加载大量图像,并存储它们,因此它们只加载一次。 它还创建了多个BufferedImages,大约400x400,其中不超过10个。
文件中的图像总数约为6MB。 每个BufferedImage应该大约为400x400x4 = 640KB。
然而,内存使用量是500MB!
其中一些将用于该计划的其余部分,但我非常确定这些图像占据了大部分空间。
有谁知道怎么办? 或者使用较少内存的BufferedImage的替代方法?
答案 0 :(得分:4)
听起来像你的应用程序(不是库)有内存泄漏。在第一个实例中,您应该尝试使用标准Java内存分析器来识别泄漏。
修改强>
现在你已经确定有很多BufferedImages
闲置,你需要做的下一件事是弄清楚为什么它们仍然可以访问。进行堆转储,查看一些实例,看看它们是如何连接到堆根的;见http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/heapdump.html
在执行此类操作时,使用您喜欢的Java IDE查看Java源代码的相关部分非常有用。
答案 1 :(得分:1)
您的程序是否为Web应用程序?或者您正在开发类似JRE的应用程序?你如何加载你的图像?
在基于Web的应用程序中,我会使用CSS-Sprite映像来解决我的问题,因为它会切断多个HTTP请求,并在加载时提高带宽使用率和内存使用率。
在JRE应用程序中,应该有一种方法以相同的方式使用图像精灵,加载图像精灵的400x400的偏移量,以减少BufferedImage对象的使用并提高性能。