Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance JavaFX中的内存使用是如何构造的?_Performance_Memory Management_Javafx - Fatal编程技术网

Performance JavaFX中的内存使用是如何构造的?

Performance JavaFX中的内存使用是如何构造的?,performance,memory-management,javafx,Performance,Memory Management,Javafx,我正在用JavaFX编程一个应用程序,它可以显示大图像(大约10000×10000像素大)。图像显示在滚动窗格中。(使用图像视图类) 为了获得相对较低的内存使用率,我将图像光栅化为大量的单个图像。(放置在滚动窗格中的一组imagw查看器的数量),因此图像的部分将放置在滚动窗格中的一行中。目标是卸载不在视口区域中的图像。我知道,我可以卸载节点。但我不知道这些图像是被卸载并保留在内存中,还是被从内存中删除 我的问题是: 通过JavaFX的image类声明的图像是在初始化时加载到内存中的还是在需要时加

我正在用JavaFX编程一个应用程序,它可以显示大图像(大约10000×10000像素大)。图像显示在滚动窗格中。(使用图像视图类) 为了获得相对较低的内存使用率,我将图像光栅化为大量的单个图像。(放置在滚动窗格中的一组imagw查看器的数量),因此图像的部分将放置在滚动窗格中的一行中。目标是卸载不在视口区域中的图像。我知道,我可以卸载节点。但我不知道这些图像是被卸载并保留在内存中,还是被从内存中删除

我的问题是: 通过JavaFX的image类声明的图像是在初始化时加载到内存中的还是在需要时加载

我的想法是将image view对象中的图像设置为null。(ImageView.setImage(空))

我希望我的文字没有那么混乱

编辑: 我知道,如果动态卸载图像,性能会下降

编辑:


这是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的实现更好,因为它可以更原生。我不知道。我会努力找出答案的!