2013-02-21 48 views
3

我正在编写一个利用JavaFX的应用程序,每20-30秒在屏幕上和屏幕上滚动大量图像内容。它意味着能够运行多个小时,吸引全新的内容,并在几分钟内丢弃旧内容。我的系统有512Mb的图形内存,几分钟后,所有内存都被JavaFX占用,无论我如何处理JavaFX场景,都不会释放它。我一直非常小心地放弃节点,最多一次在内存中有50-60个图像节点。我真的需要能够做到支持这些图像的图形内存的硬性发布,但一直未能弄清楚如何实现,因为JavaFX中的Image接口看起来非常高。 JavaFX将继续运行良好,但由于资源有限,其他图形重度应用程序将无法加载。有没有办法强制JavaFX发布视频内存?

我正在寻找类似的flush()方法上java.awt.image.Image: http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html#flush()

我在Linux上运行的Java 7u13。

编辑:

我设法制定出一个潜在的解决方法(见下文),而且也进入了一个JavaFX的JIRA票要求上述功能:

RT-28661 Add explicit access to a native resource cleanup function on nodes.

回答

1

我能想出的最佳解决方法是将我的JVM的最大堆设置为显卡可用限制的一半。 (我有512MB的图形内存,所以我将它设置为-Xmx256m)这迫使GC更积极地清理丢弃的javafx.image.Image对象,这反过来似乎触发了JavaFX部分的图形内存清理。

以前我的堆空间设置为512MB(我有4GB的系统内存,所以这是一个非常易于管理的限制)。这个问题似乎是JVM在清理我的图像时非常懒惰,直到它开始接近这个512mb的限制。由于我的所有图像数据都被复制到图形内存中,这意味着在JVM真正开始真正关心清理之前,我很可能已经耗尽了我的图形内存。

我也尝试了一些建议,通过jewelsea:

我打电话setCache(假的),所以这可能是具有积极的影响,但直到我放弃了我的最大堆大小,我没有注意到的改进。

我试着用Java8运行一些积极的结果。它在图形内存管理方面似乎表现得更好,但它仍然占用了我所有的内存,并且在我几乎不在的时候似乎并没有开始关注图形内存。如果减少你的应用程序的堆栈限制是不可行的,那么评估Java8预发布版本可能是值得的。

我将向JavaFX项目发布一些功能请求,并提供指向JIRA门票的链接。

+0

只需要清楚,“半”没有什么神奇之处,你只需要确保留下足够的空间用于其他任何需要在系统上运行的空间。 – theJuddson 2013-02-22 16:22:03

+0

经过几天的调整和监控我的设置之后,这种解决方法似乎只取得了中等成功。如果我打开缓存,我的视频内存仍然会失去控制,即使关闭它,它最终会超出我的堆空间设置。看起来好像GC实际上不足以触发本地资源清理。张贴JIRA的请求以请求明确的清理访问。 RT-28661 – theJuddson 2013-02-26 20:54:24

1

也许你是遇到与以下问题的根本原因有关的行为:

RT-16011 Need mechanism for PG nodes to know when they are no longer part of a scene graph

从问题描述:

有些PG节点包含手柄以非堆资源,如GPU的纹理,这是我们希望当节点是场景图中不再积极回收。不幸的是,没有机制向他们报告这种状态变化,因此他们可以释放他们的资源,所以我们必须依靠GC,Ref队列的组合以及有时最终确定来回收资源。当垃圾收集落后并且我们用完这些有限的资源时,对这些资源中的某些资源的懒惰回收可能会导致异常。

当您查看我链接的问题页面(注册是查看问题,但任何人都可以注册)时,可以看到许多其他相关问题。

样本相关的问题是:

RT-15516 image data associated with cached nodes that are removed from a scene are not aggressively released

在其上的用户评论说:

我找到了一个解决方法我的应用程序只是settihg了一个使用cashe的假所有经常使用节点。 2天工作,没有任何崩溃。

因此请尝试在您的节点上调用setCache(false)

另请尝试使用Java 8 preview release其中一些问题已得到解决,看看它是否会增加应用程序的稳定性。虽然目前,即使在Java 8个分公司,还有开放式的问题,如下列:

RT-25323 Need a unified Texture resource management system for Prism

目前质感资源是依赖于它是如何使用至少2个地方分别进行管理;一个是用于图像的纹理缓存,另一个是用于RTT的ImagePool。这种方法在其设计上存在缺陷,即2个高速缓存彼此不知道,并假定系统具有无限的本地资源。

使用video card with more memory可能要么减少或消除的问题。

您也可以组合一个minimal executable example来演示您的问题并提出bug request against the JavaFX Runtime project以便JavaFX开发人员可以调查您的方案并查看它是新的还是已知问题的副本。

+1

感谢您的彻底回应。目前,我正在运行带有最新Java 8预览版的应用程序,并且迄今取得了可喜的成果。它仍然占用了我大部分的图形内存,但在接近内存资源限制时似乎更好地释放内存。我有我们的应用程序在一夜之间运行,并会在早上看到系统的样子。我认为我的问题与RT-15516中列出的完全相同。我仍然可以输入一个请求暴露清除方法的API。 – theJuddson 2013-02-22 03:54:05

相关问题