2013-02-26 40 views
7

JavaFxアプリケーションを作成しています。ボタンをクリックすると、新しいstageという表が開きます。しかし、私の問題は、そのテーブルのstageを閉じると、メモリがアプリケーションによって空きになっていないことです。 javaFXに何か問題はありますか?私は何か別のことをしなければならないのですか?JavaFX Stageを終了した後でメモリを解放する方法は?

私はその段階の終了時にすべてをnullに設定しようとしましたが、まだメモリが空いているわけではありません。テーブルのステージにイベントを閉じる

テーブルビューのtableView。

ステージmyStage;

​​

私は舞台のためにfxmlファイルを使用してシーンをロードするためにreplaceSceneというメソッドを作成しています。コントローラーを戻し、シーンをステージに設定します。

public static Initializable replaceScene(String fXml, Stage mystage) { 
    InputStream in = null; 
    try { 
     FXMLLoader loader = new FXMLLoader(); 
     in = Utility.class.getResourceAsStream(fXml); 
     loader.setLocation(Utility.class.getResource(fXml)); 
     loader.setBuilderFactory(new JavaFXBuilderFactory()); 
     AnchorPane page; 
     try { 
      page = (AnchorPane) loader.load(in); 
     } finally { 
      in.close(); 
     } 
     Scene scene = new Scene(page); 
     mystage.setScene(scene); 
     return loader.getController(); 
    } catch (Exception ex) { 
     return null; 
    } 
} 
私は最初のFXMLファイルのStreamObject(java.io.InputStreamを)を取得し、ページをロードするためにFxmlLoaderにこのstreamObjectを渡しています

= Utility.class.getResourceAsStream(FXML)で;

私はメモリ管理およびJavaFXのための特別なものは何もありませんでのInputStreamオブジェクトに

答えて

6

sun.net.www.protocol.jar.JarURLConnection $ JarURLInputStreamのオブジェクトを取得しています。定義されたメモリ制限に達するとGCが実行されます。 object = nullを設定した後は実行されません。 System.gc()を呼び出しても、GCが実行されるわけではありません。 Javadocから:

GCメソッドを呼び出すは、Java仮想マシンが、彼らは現在、迅速な再利用可能な占有メモリ を作るために使用されていないオブジェクトのリサイクルに向けた 労力を費やすを示唆しています。

どこかでメモリリークが発生しているかどうかを判断するには、たとえばVisualVMを使用して、アプリケーションのメモリ不足を確認します。

+0

私はあなたに役立つでしょう質問may.mayを更新しました。 – Ronak

+0

@Ronakあなたのアップデートはあなたの質問にどのように関連していますか? – Kai

+0

私は、入力ストリームを使ってシーンを読み込んでいるときに、メモリを解放しないと言っています。 – Ronak

1

私は非常に似た質問を掲載しようとしていました。私はトレーニングによってソフトウェアエンジニアではないと告白する必要があります。私のアプリ開発スタイルは、おそらく「ニュアンスのない」実践とスタイルに依存しています。 Javaについて私が大好きなのは、内蔵メモリ管理です。私がJavaについて愛さないことの1つは、内蔵メモリ管理です。

例えば、Visual Basic 6では、オブジェクトの参照カウントがゼロになると、破棄されることが保証されます。Visual Basic 6でモーダルダイアログウィンドウを実装することは非常に簡単だった:myFormを参照がクリアされたとして

Set myForm = new frmGetClientData 
Call myForm.Initialize() 
myForm.show, vbModal 
nResult = myForm.getResult() 
myForm.Hide() 
Set myForm = nothing 

はできるだけ早く、それが破壊されてしまいます。これは、新しいフォームが毎回構築され、初期化されることを確実にしたので便利でした。

Javaでは、モーダルダイアログウィンドウを使用するのは非常に難しいです。対話コントローラオブジェクトは、参照を渡さない限り、親コントローラオブジェクトについて何も知らない。同様に親コントローラオブジェクトは、メソッドを呼び出す必要がある場合、ダイアログコントローラへの参照を取得する必要があります。新しいステージを構築する際の親コントローラは、ダイアログステージのモダリティをモーダルに設定するために、独自のステージへの参照を取得する必要があります。

これらの参照はすべて前後していますが、Javaではモーダルダイアログウィンドウはガベージコレクションされません(親ウィンドウとコントローラを参照する参照は有効なままなので)... FXMLLoaderを使用してダイアログウィンドウを作成して表示するたびに、新しいラージオブジェクトが非常に長い寿命でメモリに格納されます。 Javaでモーダルダイアログウィンドウを使用すると、メモリリークが発生します。

解決策の1つは、Visual Basicモードに入り、使用されなくなったときにダイアログウィンドウとコントローラとの間の参照を解放することです。どんな面倒です。これは、ウィンドウがいつ破壊されるかを保証するものではありません。

ダイアログプールを作成し、ダイアログウィンドウを表示するたびに新しいウィンドウを作成するのではなく、ダイアログプールを作成して、必要なときにいつも既知の初期状態に設定する初期化メソッドを使用しますVisual Basicと同じです)。

これについてJavaFXで洞察する人はいますか?私はモーダルダイアログウィンドウを構築して管理するのに役立つヘルパークラスを作成中ですが、これは本当に必要ではないと私には思われます。私は自分のために余分な仕事をしているだけかもしれません。

関連する問題