簡體   English   中英

更新JavaFX BarChart數據會導致內存泄漏

[英]Updating JavaFX BarChart data causes memory leak

我發現我認為是JavaFX(1.8u40 GA和1.8u60 b10 EA) BarChart中的內存泄漏,是通過替換系列中的所有數據值觸發的。 我們的應用程序每秒執行幾次此操作,這很惱火。

使用jvisualvm顯示javafx.scene.layout.StackPane實例的數量不受控制地增長,最終導致OutOfMemoryError。 BarChart在內部將樣式化的StackPane節點用於條形圖。

我嘗試了其他策略來更新列表。 所有都顯示相同的問題。

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

有趣的是, Oracle BarChart教程中的示例通過首先添加所有條形/點,然后使用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();
    }
}

總之,這是JavaFX團隊接受的真實問題,並由JDK-8094805在8u60中修復

有關更多詳細信息,請參見https://bugs.openjdk.java.net/browse/JDK-8094805

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM