我正在编写一个 Java Swing 应用程序,它将从磁盘加载大约 1500 张 png 图像,每个图像的大小从 50kb 到 75kb 不等。我不需要一次加载所有这些,但我需要一次加载 50 张图像。我一直在尝试使用典型的方式加载它们:
new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg")
但是我的应用程序卡住了,并且我在大约前 30 张图像后耗尽了内存。
加载这些图像的最佳方式是什么,这样我就不会使 jvm 过载,并且我将能够监视到目前为止哪些已成功加载?如果可能且有必要,我不介意应用程序在加载图像时是否显示“正在加载...”屏幕,但我不确定该怎么做。
缓存在这里有用吗?不是很懂,但是看到了this question关于使用 MediaTracker,我不确定如何在此处实现。
最佳答案
为什么不为每个图像创建一个包装器对象,按需加载它们,并利用 WeakReference s 或 SoftReference秒。这样垃圾收集器可以在必要时对图像数据进行分类,并且您可以在清除弱引用时重新加载。
好处是当需要用于其他用途时,可以清除图像的内存。缺点是您必须在显示之前重新加载图像(或者您对图像所做的任何操作)。
关于Java Swing : Read many images files without memory problems?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658306/