Updating JavaFX BarChart data causes memory leak?
Jonathan Giles
jonathan.giles at oracle.com
Wed Apr 15 20:49:11 UTC 2015
You don't mention what version of JavaFX you are using. Assuming you
have tested this issue against 8u40 and / or 8u60 EA builds, and if the
issue persists, then yes, please file an issue in Jira.
Thanks,
-- Jonathan
On 15/04/2015 11:53 p.m., Adam Granger wrote:
> Hi, I've just asked this on stackoverflow, but I'm guessing someone from
> this group might be able to help better... Should I raise a JIRA?
>
> I've discovered what I believe is a memory leak in BarChart triggered by
> replacing all the data values in the series. This is exasperated by our
> application which does this several times a second.
>
> Using `jvisualvm` shows an uncontrolled growth in the number of
> javafx.scene.layout.StackPane instances which eventually results in an
> OutOfMemoryError. Styled StackPane nodes are used internally by BarChart
> for the bars.
>
> I've tried a different strategies to update the list. All exhibit the same
> issue.
>
> // 1
> series.getData().clear();
> series.getData().addAll(list);
> // 2
> series.getData().setAll(list);
> // 3
> series.setData(list)
>
> Interestingly the example in the BarChart tutorial updates values by
> adding all the points first, and then mutating using
> XYChart.Data.setYValue(). This could work, but is not convenient for us as
> the number of data points can vary dynamically.
>
> Specific questions
>
> * Is there anyway to avoid this issue, other than a extra logic using the
> setYValue() approach above.
> * Have I stumbled across an actual memory leak in JavaFX? or just an
> artefact of my misuse of the API? Surely freeing internal nodes when data
> is updated is JavaFX responsibility
>
> Example
>
> 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();
> }
> }
>
>
>
More information about the openjfx-dev
mailing list