我有一个实时显示4 LineCharts
的java程序。其中每个都有2个系列(我使用XYChart.Series<Number, Number>()
,LineChart.Series<Number, Number>()
显示警告),用户可以使用滑块浏览X轴(水平)。
我的问题是我需要在这些系列中保留每个系列的10000(峰值)值,以便usar可以在图表上向左或向右(使用滑块),这总共可以产生大约80000个值。 / p>
(系列存储最多10000个值,但图表同时显示500个值,因此用户可以选择他/她想要看到的滑块中的500个中的500个)
我在列表上只有太多的值,这导致了这个:
正如你在图片中看到的,大多数创建的对象都与图表有关,我真的不能说太多,因为我不知道。有没有办法阻止JavaFX创建这个对象?
整体RAM和CPU使用率如下所示:(这让我相信我正在创建过多的对象并使GC工作太多)
我一直在搜索信息,我认为WeakReferenceQueue$ListEntry
是一个标记为要删除的节点?但我不确定这一点,或者如何防止创建这些。
如何防止JavaFX创建这么多对象? (节点?)
这些图表仅是现在采用的示例,每个系列大约有4000个值,使用更多数据(最多10000个)时CPU和RAM使用率会更高。
答案 0 :(得分:0)
我假设您已经创建了8个XYChart.Series
,并在其中每个中添加了所有10000 XYChart.Data<X,Y>
个值。 Series
对象将所有Data
值存储在ObservableList
中。 JavaFX可观察性在内部使用了弱引用,因此我假设为每个Data
对象生成了一个弱引用。基本上Series
和Data
很重,因此不应用作原始数据的后备存储。
鉴于您一次只显示Series
的500个值,您可以做的是仅将{500}的500个Data
对象保留在用户当前正在查看的Series
中。根据滚动位置,从包含原始数据点的支持数组中添加新的Data
并删除Data
中的旧Series
。
我在project中对绘制连续的传感器遥测数据做了类似的操作。 自述文件显示了应用程序映像。 您特别感兴趣的是行that update the LineChart及其行caller。