5

メモリ リークを引き起こすサンプル アプリケーションを作成しました。

問題は、シーンを「リロード」する必要があることです。それぞれ 1 つのボタン (ButtonBar と ButtonFoo) を持つ 2 つのシーン (Bar と Foo) がある場合、ボタンは現在のシーンを変更して新しいシーンを作成します。ButtonBar と ButtonFoo を 5 分間 (またはそれ以下) クリックし続けると、その単純なプログラムのメモリ消費量がどんどん増えていきます。

Bar.java

public class Bar implements Initializable {

@FXML
private Label label;

@FXML
private void toFoo(ActionEvent event) {
    try {
        Button button = (Button) event.getSource();
        Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml"));
        Stage currentStage = (Stage) button.getScene().getWindow();
        currentStage.setScene(new Scene(root));
    } catch (IOException ex) {
        Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}    
}

Foo.java は、de fxml のロードを変更するのと同じです。

fxml にはボタンが 1 つだけ含まれています。

<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" />

本当のメモリリークの問題はありますか? これを行う別の方法を知っている人はいますか?このアプリが存続し、サービスのように永遠に変化を続けることを望んでいます。ありがとう

4

3 に答える 3

1

私は同様の問題を抱えています。

シーンでマウスを動かしたとき。メモリ使用量が増加し、ダウンすることはありません

これはマウスイベントに関連していると思います。

幸運を!

于 2012-04-12T14:00:40.430 に答える
1

メモリ リークについてはよくわかりませんが、パフォーマンス上の理由から、リソースを繰り返しロードすることは避けたいと思います。

私がしていることは、そのルートの親を変数に保持し、それをシーンに追加することです。私の場合は、必要に応じて別のシーンの特定の部分に追加し、コントローラー クラスの静的メソッドを介して値を更新します。

ユーザーがリストから特定の値を選択するたびに、より大きなシーンの一部を更新するこれらのプリロードされたシーンがいくつかあります。

于 2012-06-15T09:00:50.130 に答える
1

FX8を試すことをお勧めします。メモリ リークの多くの修正が既に行われています。

ただし、JavaFX の最新バージョンに更新できない場合はonAction="#toFoo"、FXML で使用しないことをお勧めします。

代わりに、イベント ハンドラーを宣言し、次を呼び出しますbuttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);

現在の画面を終了する前に、イベント ハンドラーを解放します。buttonBar.removeEventHandler(declaredEventHandler);

于 2013-11-08T01:22:46.587 に答える