【问题标题】:Updating JavaFX BarChart data causes memory leak更新 JavaFX BarChart 数据会导致内存泄漏
【发布时间】:2016-12-23 14:36:23
【问题描述】:

我发现我认为是 JavaFX(1.8u40 GA 和 1.8u60 b10 EA)BarChart 中的内存泄漏是通过替换系列中的所有数据值触发的。这被我们的应用程序激怒了,它每秒执行几次。

使用jvisualvm 显示 javafx.scene.layout.StackPane 实例的数量不受控制地增长,最终导致 OutOfMemoryError。样式化的 StackPane 节点由 BarChart 在内部用于条形图。

我尝试了不同的策略来更新列表。都表现出相同的问题。

// 1
series.getData().clear();
series.getData().addAll(list);
// 2
series.getData().setAll(list);
// 3
series.setData(list)

有趣的是,Oracle BarChart tutorial 中的示例通过首先添加所有条/点来更新值,然后使用XYChart.Data.setYValue() 改变它们。这可以工作,但对我们来说并不方便,因为数据点的数量可以动态变化。

具体问题

  • 除了使用上面的 setYValue() 方法的额外逻辑之外,还有什么方法可以避免这个问题。
  • 我是否偶然发现了 JavaFX 中的实际内存泄漏?或者只是我滥用 API 的产物? JavaFX 负责在数据更新时释放内部节点

例子

public class ChartUpdate extends Application {
    private int clock;
    public static void main(String[] args) {
        launch(args);
    }
    @Override
    public void start(Stage stage) {
        CategoryAxis xAxis = new CategoryAxis();
        NumberAxis yAxis = new NumberAxis(0, 100, 10);
        yAxis.setAutoRanging(false);
        BarChart<String, Number> graph = new BarChart<>(xAxis, yAxis);
        graph.setAnimated(false);
        Series<String, Number> series = new Series<>();
        graph.getData().add(series);
        stage.setScene(new Scene(graph));
        stage.show();

        Timeline timeLine = new Timeline();
        timeLine.getKeyFrames().add(
                new KeyFrame(Duration.millis(500),
                        (e) -> {
                            ObservableList<Data<String, Number>> list = FXCollections.observableArrayList();
                            for (int i = 0; i < 100; i++) {
                                list.add(new Data<>(String.valueOf(i), (clock + i) % 100));
                            }
                            series.setData(list);
                            clock++;
                        }));
        timeLine.setCycleCount(Animation.INDEFINITE);
        timeLine.play();
    }
}

【问题讨论】:

  • 我认为这个错误在 8u60 中已修复。但这是一个测试版。
  • 我查看了 JavaFX JIRA,但找不到 JIRA,您知道参考吗?

标签: java javafx-8


【解决方案1】:

总而言之,这是一个被 JavaFX 团队接受并由 8u60 中的 JDK-8094805 修复的真正问题

更多详情请参阅https://bugs.openjdk.java.net/browse/JDK-8094805

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-16
    相关资源
    最近更新 更多