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