メモリリークが発生しました。私のコードでは修正できません。 シナリオ:ユーザーが新しいウィンドウを開き、グラフが描画されます(この場合は線グラフ)。ウィンドウが閉じているときしかし、java.lang.ref.WeakReferenceとjavafx.beans.property.BooleanPropertyBase $リスナーは、メモリ内に残っています。その数は描画されたデータ点(XYChart.Data)に完全に対応しています。 私はちょうどそれらを取り除く方法を理解できません。 私のコードでは、これらのウィンドウの多くは頻繁に開かれ、閉じられ、チャートやメモリごとに10k〜100kのデータポイントがかなり速くいっぱいになります。グラフの描画時にJavaFX WeakReferenceメモリリークが発生する
私はいくつかばかな間違いをしたと確信していますが、私はそれを見つけることができません。ヘルプは非常に高く評価されるだろう!
サンプルコード:
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Test extends Application {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Application.launch(Test.class, args);
}
@Override
public void start(final Stage primaryStage) {
primaryStage.setTitle("Hello World");
Group root = new Group();
Scene scene = new Scene(root, 300, 250, Color.LIGHTGREEN);
Button btn = new Button();
btn.setLayoutX(100);
btn.setLayoutY(80);
btn.setText("Create stage");
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
new CreateStage();
primaryStage.toFront();
}
});
root.getChildren().add(btn);
primaryStage.setScene(scene);
primaryStage.show();
}
}
class CreateStage {
public CreateStage() {
Stage stage = new Stage();
stage.setTitle("Line Chart Sample");
//Basic Chart attributes
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("RT [minutes]");
yAxis.setLabel("Intensity");
LineChart<Number, Number> linechart = new LineChart(xAxis, yAxis);
XYChart.Series newSeries = new XYChart.Series();
List<XYChart.Data> list = new ArrayList<>();
//just fill the chart with data points
for (int j = 0; j < 10000; j++) {
float intensity = j;
float currentRT = j;
list.add(new XYChart.Data(currentRT, intensity));
}
newSeries.getData().addAll(list);
// add new Series
linechart.getData().add(newSeries);
Scene scene = new Scene(linechart,800,600);
stage.setScene(scene);
stage.show();
}
}
ガベージコレクションが実際にトリガーされていますか。さらに、 'ImageView' /' Image'で同様の問題が発生しました。シーングラフから 'ImageView'を単に削除するだけで、' Image'がガベージコレクションに利用できなくなりましたが、 'ImageView'の' image'プロパティを設定したので、グラフのデータを 'null'に設定すると役立ちます。 .. – fabian
はい、残念ながら、私は確信しています。私はすでに似たようなことを試みたと思いますが、私は再びそれを調べます、ありがとう! –