1

この質問は android または java のいずれかに対するものです。クラスのインスタンス(スレッドも)があるとします。

インスタンスを破棄/閉じるのを忘れないようにするために(そしてメモリリークの可能性を回避するために)、このインスタンスへの参照がなくなった場合、特定のメソッドを自動的に呼び出して、それ自体を破棄/閉じます(スレッドの場合は、おそらくそれ自体が中断されます)。

そのようなことを強制することは可能ですか?必要に応じて、そのようなことが GC 中にのみ発生することを気にしません。

4

3 に答える 3

3

このインスタンスへの参照がなくなると、特定のメソッドが自動的に呼び出され、それ自体が破棄/クローズされます (スレッドの場合は、おそらくそれ自体が中断されます)。

finalize()は、ここで説明したことを行います。ただし、使用されることはめったになく、使用する際にいくつかの落とし穴があります。ガベージコレクションを制御できないため、ファイナライズがいつ実行されるかはわかりません。API から:

ただし、ファイナライズの通常の目的は、オブジェクトが取り消し不能に破棄される前にクリーンアップ アクションを実行することです。たとえば、入出力接続を表すオブジェクトの finalize メソッドは、明示的な I/O トランザクションを実行して、オブジェクトが完全に破棄される前に接続を切断する場合があります。

ガベージ コレクションを強制することはできません。System.gc()を使用して JVM にそうするように提案することしかできませんが、それが行われるという保証はありません。

于 2012-05-22T14:44:11.017 に答える
1

これが非常に遅いことはわかっていますが、いつか誰かに役立つことを願っています.

私が開発しているgcRadarというライブラリを使えば、このようなイベントを受け取ることができます。オブジェクトが孤立したとき、およびオブジェクトの実際のガベージ コレクションの後にイベントを提供します。

ライブラリの改善に関する提案は大歓迎です。

于 2013-12-13T05:34:00.333 に答える
0

VM が保持する参照にアクセスする方法はありません。Zavior が示唆したように、オブジェクトまたはオブジェクトの「島」にアクセスできないことを確実に知る唯一の方法は、finalizeメソッドを使用することです。

GC の実行中にのみ通知を受け取ることに注意してください。したがって、まだ参照されているが閉じる必要があるリソースを閉じたり破棄したりするのには実際には役立ちません。それも行いたいが、 のような構造を使用したくないtry/catch/finally場合は、リソースのマネージャー クラスを作成する必要があります。

マネージャークラスを含むどの可能性でも、リソースを統合するための「防弾」の方法は得られません。注意することが最善の解決策です。

編集:

役に立つかもしれないこのスレッドを見つけました。

于 2012-05-22T14:59:50.947 に答える