减少JavaFX RAM的使用

时间:2016-12-01 13:11:32

标签: java performance javafx ram

我有一个实时显示4 LineCharts的java程序。其中每个都有2个系列(我使用XYChart.Series<Number, Number>()LineChart.Series<Number, Number>()显示警告),用户可以使用滑块浏览X轴(水平)。

我的问题是我需要在这些系列中保留每个系列的10000(峰值)值,以便usar可以在图表上向左或向右(使用滑块),这总共可以产生大约80000个值。 / p>

(系列存储最多10000个值,但图表同时显示500个值,因此用户可以选择他/她想要看到的滑块中的500个中的500个)

我在列表上只有太多的值,这导致了这个:

Object RAM usage 1 Object RAM usage 2

正如你在图片中看到的,大多数创建的对象都与图表有关,我真的不能说太多,因为我不知道。有没有办法阻止JavaFX创建这个对象?

整体RAM和CPU使用率如下所示:(这让我相信我正在创建过多的对象并使GC工作太多)

enter image description here

我一直在搜索信息,我认为WeakReferenceQueue$ListEntry是一个标记为要删除的节点?但我不确定这一点,或者如何防止创建这些。

如何防止JavaFX创建这么多对象? (节点?)

这些图表仅是现在采用的示例,每个系列大约有4000个值,使用更多数据(最多10000个)时CPU和RAM使用率会更高。

1 个答案:

答案 0 :(得分:0)

我假设您已经创建了8个XYChart.Series,并在其中每个中添加了所有10000 XYChart.Data<X,Y>个值。 Series对象将所有Data值存储在ObservableList中。 JavaFX可观察性在内部使用了弱引用,因此我假设为每个Data对象生成了一个弱引用。基本上SeriesData很重,因此不应用作原始数据的后备存储。

鉴于您一次只显示Series的500个值,您可以做的是仅将{500}的500个Data对象保留在用户当前正在查看的Series中。根据滚动位置,从包含原始数据点的支持数组中添加新的Data并删除Data中的旧Series

我在project中对绘制连续的传感器遥测数据做了类似的操作。 自述文件显示了应用程序映像。 您特别感兴趣的是行that update the LineChart及其行caller