2

コンテキスト: 親の「ランチャー」プログラムから実行される Swing JFrame アプリケーションがあります。ランチャーは、更新の確認と実際のアプリの更新を担当します。そのため、子クラスローダーでアプリを実行し、最終的に新しい jar が利用可能になったときにアプリを再起動します。

現在、すべて正常に動作していますが、この問題があります。JFrame から何かがリークされ、JFrame とクラスローダー全体の両方がガベージ コレクションされないように見えます。Frame.getFrames() を循環すると、JFrame が破棄されたとしても、何らかの形でまだそこにあることがわかります。

テストケースを次のクラスに減らすことができました。バグが発生するには setBounds の呼び出しが必要であることに注意してください。これを削除すると、JFrame は正しくガベージされ、getFrames() から消えます。メソッドは内部で何百万ものことを行うため、メソッドの何が問題を引き起こすのか理解できませんでした。

私はJDK 1.7.0_25-b17で実行しています

import java.awt.Frame;
import java.io.IOException;

import javax.swing.JFrame;

public class BugTest extends JFrame {
    public BugTest() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setBounds(0, 0, 100, 100); // <- comment this and the leak disappear! -<<
        setVisible(true);
    }

    public static void main(String[] args) throws IOException {
        new BugTest();

        System.out.println("Close the window then press enter");
        System.in.read();
        System.gc();

        Frame[] frames = Frame.getFrames();
        System.out.println("There are " + frames.length + " frames (should be 0)");
        for (Frame frame : frames) {
            System.out.println(frame);
        }
    }

    public void finalize() {
        System.out.println("Frame was finalized");
    }
}

ところで、スレッド AWT-Windows を強制終了することは不可能のようです。一度開始すると、ウィンドウなどがなくなっても終了することはありません。きれいに掃除できますか?

何が起こっているのかについて洞察を持っている人はいますか?すべてをきれいにするために何か他のことをすることになっていますか?

4

1 に答える 1

3
  • 最上位コンテナは、ネイティブ OS のリソース (AWT リソース) に基づいています。

  • これのライフサイクルはObjectsJVMと一緒にのみ終了し、GCされることはありません。あなたの側で変更を加える必要があります

于 2013-07-31T11:50:53.277 に答える