私がアプリケーションで発見したメモリリークの1つは、java.awt.Window.allWindows
プライベート静的フィールドです。これは、インスタンス化されたすべてのWindowを追跡します。作成され、使用され、そして忘れられたダイアログボックスがあり、それらが消えてガベージコレクションされるという期待がありました。このプライベートフィールドは、dispose()
メソッドが呼び出されるまで、無限に範囲内に保持されます。そして定義上、範囲外になったときにはそのことを行うことはできません。なぜ範囲外になるjava.awt.Windowをdispose()する必要がありますか?
なぜこのように設計されているのかわかりません。ガベージコレクションの精神に反して、私がWindowオブジェクトで終わったときに明示的にシステムに知らせる必要があるようです。明らかに、私はそれが範囲外であるので、それで終わった。
私はdispose()
メソッドが何をしているのか理解しています:システムピアオブジェクトを取り除く。私はこれがJavaの外であり、それを行うための何らかの方法が必要であり、Swingはそれらのオブジェクトの追跡を失ってはならない、そうでなければメモリリークがあると理解しています。しかし、何が私の窓への参照を永遠に周りに保持することによって達成されるとき、私は再びそれを使用するつもりはない?
これがなぜ必要なのか誰かが説明できますか?
'removeNotify'が呼ばれると、' Window'は 'allWindows'から削除されます。 'Window'sにはネイティブリソースが含まれているので、データベース接続の場合と同じように処理する必要があります。 –
データベース接続が有効範囲外になると自動的に閉じられるという印象を受けました。私はおそらくそれについて間違っている。 :)今日は、短いプログラムを除いて、サーバーによって私のために管理されているものはすべてです。 – skiphoppy