0

Java言語仕様の§12.6では、次のように述べています。

Java プログラミング言語では、オブジェクトのストレージが再利用される前にファイナライザーが呼び出されることを除いて、ファイナライザーが呼び出されるまでの時間を指定しません。

オブジェクトのストレージが再利用されるとはどういう意味ですか?

これが実行時にオブジェクトにランダムに発生することを心配する必要がありますか (例: 使用中にオブジェクトが上書きされるなど)? もしそうなら、どうすればこれを防ぐことができますか?

4

5 に答える 5

2

オブジェクトのストレージが再利用されるとはどういう意味ですか?

これが実行時にオブジェクトにランダムに発生することを心配する必要がありますか (例: 使用中にオブジェクトが上書きされるなど)?

Java のセマンティクスは、私の知る限り、そのような現象をどこにも公開していないので、それは何の意味も持たず、実装の詳細、または「有益な」コメントだと思います。

言い換えれば、このフレーズ:

except to say that it will happen before the storage for the object is reused.

適合する Java コンパイラをどのように実装する必要があるかには影響しないため、何も言わないのと同じです。

于 2013-05-10T19:15:23.613 に答える
0

Java の「ヒープ」ストレージは、黒板 (または、年齢や育った場所に応じて「黒板」や「ホワイトボード」など) の束と考えてください。

オブジェクトを作成するときは、使用する黒板の 1 つを「要求」し、オブジェクトのデータを書き込みます。それを追跡するために、その角に紐をテープで留め、その紐を手に持ってください。あなたはその手に持っている糸を「リファレンス」と呼びます。

次に、2 番目のオブジェクトを作成し (別の黒板を要求します)、名前を書き、最初の文字列の端をその名前の隣の 2 番目の黒板にテープで貼り付けます。その名前はオブジェクトのフィールドであり、作成した最初のオブジェクトを参照します。

ある黒板から次の黒板へとたどり、まだ使用している最も遠い黒板にたどり着くことができる文字列がある限り、その遠くの黒板に書いたものを読むことができます.

黒板の 1 つが不要になった場合は、黒板と手の間、またはテープで留めた別の黒板のどこかにある紐を取り除きます。(これは参照 null を設定しています。)

黒板につながる紐がなくなったら、用務員が黒板を消去して、黒板を必要とする他の人が利用できるようにすることができます。彼がこれを行うとき、彼はその黒板から他のものにつながる弦を取り除き、他の弦がそれらに到達しなければそれらも消去されます. (例えば、2 つの黒板が互いに結び付けられているだけで、他の文字列がそれらに到達していないかどうかも注意深く調べます。それらも同様に消去されます。)

「ファイナライザー」とは、黒板の側面にテープで貼り付けられる指示のシートです。用務員は黒板を消す直前に、そのシートの指示を読み、要求された操作を実行します。

于 2013-04-05T21:41:46.457 に答える
0

「ストレージ」とは、オブジェクトを格納するために使用される物理ヒープ領域を意味すると思います。したがって、仕様によると、ファイナライザー メソッドは、それが属するオブジェクトがまだオーバーライドされていないときに実行されることが保証されています。

オブジェクトを使用している場合 (つまり、オブジェクトへの通常の参照がある場合)、ガベージ コレクションの対象とならないため、心配する必要はありません。

于 2013-04-05T21:29:19.073 に答える
0

これが実行時にオブジェクトにランダムに発生することを心配する必要がありますか (例: 使用中にオブジェクトが上書きされるなど)?

いいえ、ありません。

簡単に言えば、GC が(純粋な Java) アプリケーションがそれらを二度と使用できないことを認識している場合にのみ、オブジェクトは上書きされます。


詳細:

オブジェクトのストレージは、ガベージ コレクションとファイナライズが完了した後にのみ再利用されます。そして、オブジェクトへの到達可能なすべての参照が失われた/上書きされた/忘れられた後にのみ、オブジェクトはガベージコレクションされます。また、オブジェクトへの到達可能な参照がない場合、アプリケーションはそれを使用できません。つまり、オブジェクトについて認識しなくなります。

実際には、到達可能性にはさまざまな「色合い」があるため、それよりも少し複雑です。たとえば、ファイナライズを待機しているオブジェクトは「ファントム到達可能」であり、ファイナライザーがオブジェクトを再び「復活」させる可能性があります。ただし、オーバーライドfinalize()するクラスを作成していない限り、これについて知る必要はありません。記憶域が再利用されるのは到達不能オブジェクトのみであり、純粋な Java プログラムが到達不能オブジェクトの状態を確認することは論理的に不可能です。

于 2013-04-06T00:13:28.947 に答える