我正在使用Java FX编写应用程序,它可以显示大图像(大约10 000×10 000像素)。图像显示在scrollPane中。 (使用图像视图类) 为了获得相对较低的内存使用率,我将图像光栅化为大量单个图像。 (放置在滚动窗格中的组中的一些想象查看器)因此,图像的各部分将放置在scrollPane中的一行中。目标是,将卸载不在视口区域中的图像。我知道,我可以卸载节点。但我不知道图像是否会被卸载并保留在内存中,或者它们是否从内存中删除。
我的问题是: 是在java fx的图像类上声明的图像是在初始化时加载到内存中还是在需要时加载它们?
我的想法是将图像视图对象中的图像设置为null。 (ImageView.setImage(null))
我希望我的文字不那么令人困惑。
编辑: 我知道,如果动态卸载图像,性能会下降。
编辑:
这是JVM内存的意思。不是本机内存
答案 0 :(得分:2)
仅从问题中就不清楚"内存"是什么意思,因为有 JVM内存和本机内存。您可以通过调整JVM设置来减少本机内存使用量。至于JVM内存,一般来说,由于how garbage collection works,任何失去强引用的对象仍将保留在内存中。在应用程序完成之前,它甚至可能在内存中。
此外,这里有一些可能有用的数字:
10 000 * 10 000 * 4 /(1024 * 1024)= ~381 MB(根据图像的存储方式,您可以浏览com.sun.prism
包以获取更多信息。)
因此,当您加载具有指定大小的单个未缩放图像时,JVM将仅为图像分配至少该内存量,更不用说其他大量内容了。因此,没有明确的确定性方法从内存中删除数据。因此,如果需要较低的本机内存使用量,则首先分配较少的内存非常重要。您可以使用this Image
构造函数执行此操作,如果您不打算立即显示图像,则会根据需要缩放图像。值得指出的是,一旦JVM声称拥有一块内存,它很少会将其恢复为本机内存。