9

私がアプリケーションで発見したメモリリークの1つは、java.awt.Window.allWindowsプライベート静的フィールドです。これは、インスタンス化されたすべてのWindowを追跡します。作成され、使用され、そして忘れられたダイアログボックスがあり、それらが消えてガベージコレクションされるという期待がありました。このプライベートフィールドは、dispose()メソッドが呼び出されるまで、無限に範囲内に保持されます。そして定義上、範囲外になったときにはそのことを行うことはできません。なぜ範囲外になるjava.awt.Windowをdispose()する必要がありますか?

なぜこのように設計されているのかわかりません。ガベージコレクションの精神に反して、私がWindowオブジェクトで終わったときに明示的にシステムに知らせる必要があるようです。明らかに、私はそれが範囲外であるので、それで終わった。

私はdispose()メソッドが何をしているのか理解しています:システムピアオブジェクトを取り除く。私はこれがJavaの外であり、それを行うための何らかの方法が必要であり、Swingはそれらのオブジェクトの追跡を失ってはならない、そうでなければメモリリークがあると理解しています。しかし、何が私の窓への参照を永遠に周りに保持することによって達成されるとき、私は再びそれを使用するつもりはない?

これがなぜ必要なのか誰かが説明できますか?

+0

'removeNotify'が呼ばれると、' Window'は 'allWindows'から削除されます。 'Window'sにはネイティブリソースが含まれているので、データベース接続の場合と同じように処理する必要があります。 –

+0

データベース接続が有効範囲外になると自動的に閉じられるという印象を受けました。私はおそらくそれについて間違っている。 :)今日は、短いプログラムを除いて、サーバーによって私のために管理されているものはすべてです。 – skiphoppy

答えて

14

私はそれを言いたくはありませんが、それはGUIの仕組みです。

Windowsは非ブロック化です。つまり、コード内にコードを作成すると、コードは引き続き実行されます。

これは、他の場所への参照を明示的に保存していない限り、ウィンドウが作成直後に範囲外になる可能性があることを意味します。この時点で、ウィンドウはまだ画面に表示されています。

これは、これで完了したときにそれを取り除くために、他の方法が必要であることを意味します。 Window dispose()メソッドを入力します。これはWindowのリスナーの1つから呼び出すことができます。

+1

D'oh!わかった!人々はいつも参照を保持しないウィンドウを作成しますが、ウィンドウは引き続き表示され実行されます。私はちょうどこの状況ではすぐにウィンドウを使用して、それを見えなくし、それを忘れる(範囲外に出る)ので、それについて考えていなかった。今、なぜこれがWindowsのデフォルトであるのか分かります。私はどこかに合理的なユースケースがあることを知っていました。 :) – skiphoppy

+0

ああ、変数が範囲外になったときにウィンドウがまだ画面に表示されていたことを指摘しておきました。私は誰かがそれを逃した場合のために私の答えにそれを編集します。 – Powerlord

2

これは、それを説明するかもしれない:AWT Threading Issues

は単純に、多くのより多くのようにバックグラウンドスレッドとで、ちょうど目に見える要素よりも、JVMで起こっているがあります。これらのスレッドおよびその他のリソースは、JVM上の最後のウィンドウが破棄されるまで維持され、その後、それらは整理され、JVMはきれいに終了することができます。したがって、使用するすべてのウィンドウ、フレーム、およびダイアログウィンドウは、基本的にJVMにロックを保持して終了しないようにするため、dispose()の呼び出しでこれを手動で管理する必要があります。

私はそれがバグのビットであることに同意します。私はこれを数回自分に打ち勝った。

1

ネイティブコード(これらのウィンドウコンポーネントのピアが何であるか)がJavaである場合、ネイティブポインタがまだ周囲にある間にガーベッジコレクタがオブジェクトをガベージコレクションしないようにするために参照を保持する必要があります。あらゆる種類の悪いもの(VMクラッシュなど)を引き起こします。

例えば、hereの説明を参照してください。

1

dispose()メソッドは、WindowEventオブジェクトが保持するオブジェクトを破棄します。アプリケーション/ pを終了させません

関連する問題