[英]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()对其进行变异来更新值。 这可能有效,但对我们来说并不方便,因为数据点的数量会动态变化。
具体问题
例
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.