2011-12-13 29 views
2

JREは、もはや参照できないオブジェクトをすべて破棄することを知っています。しかし、オブジェクトが明示的に破壊する方法はありますか?それとも、ぶら下がったポインタの問題を避けることは禁じられていますか?オブジェクトは自分自身を破壊することができますか? (Java)

Naive、私はthis = nullと言っていますが、これはコンパイラによって許可されていません(thisはおそらく本当の変数ではないでしょう)。

逆に、thisのプライベートコピーを維持することによって、オブジェクトが強制的に生き続ける方法がありますか?

+0

私は昨日、Unixにおけるファイルハードリンクの目的とそのガベージコレクションシステムの類推を理解したときに悟りました。 – jforberg

+0

これは学問的な質問ですか、それとも解決しようとしている実際の問題がありますか? –

+0

@MДΓΓБДLL、それはまったく学問的です。しかし、私は、メモリ内のオブジェクトが適切に破壊されていることを確実にしたい状況を考えることができます。 – jforberg

答えて

2

学問的側面を無視して、オブジェクトがJava(またはC#のような他のほとんどのガベージコレクション言語)で物理的に破壊されていることを保証することはできません。これは、オブジェクトの破棄が高価である(部分的にはメモリ圧縮フェーズのため)ので、できるだけ少ない回数実行することがポイントです。

これは、しかし、あなたは問題のオブジェクトがリソースを解放するために、パブリックメソッドを公開使い捨てのパターンを、使用して割り当てられたリソースを解放するためにオブジェクトを強制することができ、あなたはいつでも呼び出すことができます(または、それが取得するとファイナライザで自動的に呼び出されます)。もう少し簿記が必要ですが、本当に必要な場合は仕事が終わります。

4

いいえ実際には、何もを強制的に破棄することはできません。オブジェクトへの参照がなくても、ガベージコレクタが実行して収集するまで、メモリ内に存在し続けます。

静的な参照を保持することでオブジェクトを存続させることができます。

1

いいえ、あなたはオブジェクトを破壊することはできません。

あなたができることは、実際のオブジェクトを保持するラッパーオブジェクトを持つことです。他の誰もそのオブジェクトへの参照を持っていないことを確認した場合は、参照を削除します(nullに設定するなど)。オブジェクトがガベージコレクタの対象になります。ガーベッジを実際に収集する時期と時期を決定するのはGCに依ることに注意してください。

オブジェクトを存続させるためには、オブジェクトへの参照があることを確認する必要があります。 1つの方法は、オブジェクトのクラスから静的な参照を持つことです。誰もクラスをアンロードしない限り、オブジェクトはメモリ内に留まります。

0

あなたが言ったように、ポインタの問題を避けることは禁じられていると思います。 Javaメモリモデルはスタックとヒープモデルに基づいています。オブジェクトがそれ自身を破壊すると、オブジェクトを参照する他のポインタ(またはスタック)に何が移動するのでしょうか?

関連する問題