アプリケーションで発見したメモリリークの1つは、インスタンス化されたjava.awt.Window.allWindows
すべてを追跡するプライベート静的フィールドWindow
です。作成、使用、および忘れられたダイアログボックスがあり、これらは消えてガベージコレクションされることが期待されていました。このプライベートフィールドは、dispose()
メソッドが呼び出されるまで、それらを無期限にスコープ内に保持します。そして当然のことながら、彼らが対象範囲外になった場合、それを行うことはできません。
これがこのように設計されている理由がわかりません。Window
オブジェクトの処理が完了したときにシステムに明示的に通知する必要があるのは、ガベージコレクションの精神に反するようです。範囲外なので、明らかにそれで終わりです。
私はdispose()
メソッドが何をしているのか理解しています:システムピアオブジェクトを取り除くこと。これはJavaの外にあること、そしてそれを行うには何らかの方法が必要であり、Swingがそれらのオブジェクトを追跡するだけでなく、メモリリークが発生しないことを理解しています。しかしWindow
、二度とそれを使用するつもりがないときに、自分の周りへの参照を永遠に保つことによって何が達成されますか?
なぜこれが必要なのか誰かが説明できますか?
私はそれを言うのが嫌いですが、それはGUIが機能する方法です。
ウィンドウは非ブロッキングです。コードで作成すると、コードは引き続き実行されます。
これは、ウィンドウへの参照を他の場所に明示的に保存しない限り、ウィンドウは作成直後にスコープ外になる可能性があることを意味します。この時点では、ウィンドウはまだ画面上にあります。
これはまた、それを使い終わったときにそれを取り除くために他の方法が必要であることを意味します。Window dispose()
ウィンドウのリスナーの1つから呼び出すことができるメソッドを入力します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加