Performance JavaFX中的内存使用是如何构造的?
我正在用JavaFX编程一个应用程序,它可以显示大图像(大约10000×10000像素大)。图像显示在滚动窗格中。(使用图像视图类) 为了获得相对较低的内存使用率,我将图像光栅化为大量的单个图像。(放置在滚动窗格中的一组imagw查看器的数量),因此图像的部分将放置在滚动窗格中的一行中。目标是卸载不在视口区域中的图像。我知道,我可以卸载节点。但我不知道这些图像是被卸载并保留在内存中,还是被从内存中删除 我的问题是: 通过JavaFX的image类声明的图像是在初始化时加载到内存中的还是在需要时加载 我的想法是将image view对象中的图像设置为null。(ImageView.setImage(空)) 我希望我的文字没有那么混乱 编辑: 我知道,如果动态卸载图像,性能会下降 编辑:Performance JavaFX中的内存使用是如何构造的?,performance,memory-management,javafx,Performance,Memory Management,Javafx,我正在用JavaFX编程一个应用程序,它可以显示大图像(大约10000×10000像素大)。图像显示在滚动窗格中。(使用图像视图类) 为了获得相对较低的内存使用率,我将图像光栅化为大量的单个图像。(放置在滚动窗格中的一组imagw查看器的数量),因此图像的部分将放置在滚动窗格中的一行中。目标是卸载不在视口区域中的图像。我知道,我可以卸载节点。但我不知道这些图像是被卸载并保留在内存中,还是被从内存中删除 我的问题是: 通过JavaFX的image类声明的图像是在初始化时加载到内存中的还是在需要时加
这是JVM内存的意思。不是本机内存仅从这个问题来看,不清楚“内存”是什么意思,因为有JVM内存和本机内存。您可以通过调整JVM设置来减少本机内存的使用。至于JVM内存,一般来说,任何失去强引用的对象都会因为错误而保留在内存中。它甚至可能在内存中,直到应用程序进程完成 此外,以下数字可能会有所帮助: 10000*10000*4/(1024*1024)=~381MB(根据图像的存储方式,您可以浏览
com.sun.prism
package了解更多信息)
因此,当您加载具有指定大小的单个未缩放图像时,JVM将为该图像单独分配至少该数量的内存,更不用说其他很多事情了。因此,没有明确的确定性方法从内存中删除数据。因此,如果需要较低的本机内存使用率,首先分配较少的内存非常重要。您可以使用
Image
constructor执行此操作,如果您不打算立即显示图像,它将根据需要缩放图像。值得指出的是,一旦JVM声明了一段内存,它就很少将其返回到本机内存。仅从这个问题来看,不清楚“内存”是什么意思,因为存在JVM内存和本机内存。您可以通过调整JVM设置来减少本机内存的使用。至于JVM内存,一般来说,任何失去强引用的对象都会因为错误而保留在内存中。它甚至可能在内存中,直到应用程序进程完成
此外,以下数字可能会有所帮助:
10000*10000*4/(1024*1024)=~381MB(根据图像的存储方式,您可以浏览com.sun.prism
package了解更多信息)
因此,当您加载具有指定大小的单个未缩放图像时,JVM将为该图像单独分配至少该数量的内存,更不用说其他很多事情了。因此,没有明确的确定性方法从内存中删除数据。因此,如果需要较低的本机内存使用率,首先分配较少的内存非常重要。您可以使用
Image
constructor执行此操作,如果您不打算立即显示图像,它将根据需要缩放图像。值得指出的是,一旦JVM占用了一块内存,它就很少会将其返回到本机内存。我使用程序来查看具有这种大小和4GB RAM的图像,但至少所有图像都已关闭。我想到了原因,结果是图像大小。我还认为,使用Java我仍然会遇到这个问题。由于JavaFX默认基于硬件渲染,JavaFX中图像大小的选通因子既不是可用的系统内存也不是JVM内存,而是所用图形硬件的最大纹理大小的限制(适用于中端现代GPU,目前约为8192x8192)。我使用程序查看具有此大小和4 gb RAM的图像,但至少所有图像都已关闭。我想到了原因,结果是图像大小。我还认为,使用Java时,我仍然会遇到此问题。由于JavaFX默认基于硬件渲染,因此JavaFX中图像大小的选通因子既不可用也不可用ry也不是JVM内存,而是所用图形硬件的最大纹理大小的限制(对于中端现代GPU,目前约为8192x8192)。也许您希望实现基于ControlsFX,而不是从头开始创建。“实例化的GridCell实例数将大大少于GridView项目列表中的项目数,因为只为GridView的可见区域创建了足够的GridCell。这有助于提高性能并减少内存消耗。“@jewelsea Thx,这是一个好主意。事实上,这正是我编写的程序所做的。但你认为Oracle实现更好,因为它可以更原生。我不知道。我会尝试找出答案!也许你可能希望实现基于ControlsFX,而不是从头开始创建它。“实例化的GridCell实例数将大大少于GridView项目列表中的项目数,因为只为GridView的可见区域创建了足够的GridCell。这有助于提高性能并减少内存消耗。“@jewelsea Thx,这是一个好主意。事实上,这正是我编写的程序所做的。但你认为Oracle的实现更好,因为它可以更原生。我不知道。我会努力找出答案的!