2

に、含まnew A()れるすべてのオブジェクトを保持するのに十分な量のメモリを割り当てAます。

オブジェクトには、や などA()の他のオブジェクトが含まれる場合があります。B()C()

質問 1:A()が不要になり、ヒープから削除したい場合、その参照を設定するとうまくいきますかnull? (そうでない場合、今このオブジェクトにシグナルを送る正しい方法は何でしょうJVMか?)GC

質問 2:B()もしそうなら、と を指しているインスタンスはどうなりますか?C()

質問 3:この効果を観察する方法はありますか? (オブジェクトを解放するためにメモリの割り当てが解除されています)

4

7 に答える 7

5

A を null に設定すると、GC によって解放される候補として A がマークされます。B と C のインスタンスは、それらのインスタンスへの参照がインスタンス A からのもののみである場合にもマークされます。

質問 3 について編集:この効果をデバッグする簡単な方法は、メソッドを使用することfinalizeです。オブジェクトが GC されると、彼finalizeは と呼ばれます。

ただし、このメソッドには注意してください。finalize は常に実行されるとは限りません (GC がオブジェクトを解放することが保証されていないため)。また、アプリケーションの一般的な目的で使用しないでください。

IDE によっては、より優れたデバッグ ツールがあります。たとえば、Eclipse の場合: http://www.yourkit.com/docs/80/help/garbage_collection.jsp

于 2012-06-11T16:06:40.563 に答える
3

へのライブ参照がBありC、GC されない場合

オブジェクトへのライブ参照がない場合はいつでも、そのオブジェクトはGCされる準備ができています

class A{
 B b = new B();
 C c = new C();
}

今あなたがするとき

A a = new A();
a= null;//instance referred by a,b & c are ready to be collected in this system
于 2012-06-11T16:04:19.950 に答える
2

オブジェクトA()には、B()やC()などの他のオブジェクトが含まれる場合があります

オブジェクトには、プリミティブと他のオブジェクトへの参照のみが含まれます。

質問1:A()が不要になり、ヒープから削除したい場合、その参照をnullに設定するとうまくいきますか?

必要になることはめったにありませんが、これは可能です。

質問2:もしそうなら、B()とC()を指すインスタンスはどうなりますか

何も、それらは無関係のオブジェクトです。

質問3:この効果を観察する方法はありますか?(オブジェクトを解放するために割り当てが解除されているメモリ)

メソッドをオーバーライドするfinalize()か、ReferenceQueuesを使用できます。これは、オブジェクトを破棄するのではなく、収集されたオブジェクトについてのみ通知します。これを行う必要を避けるのが最善です。


スレッドスタックなど、ルートコンテキストからの強い参照がないオブジェクトを収集できます。これがどのように発生するかは問題ではありません。参照をnullに設定すると、これが発生する可能性がありますが、多くの場合、変数がスコープ外になることを許可する方が、オブジェクトを破棄する簡単な方法です。

オブジェクトBがあり、それがBを指すCを指し、これらのオブジェクトへの他の参照がない場合、それらのオブジェクトへの参照があっても、それらは引き続きクリーンアップされます。

于 2012-06-11T16:08:06.797 に答える
1

Aへのすべての参照を無効にし、BとCへのライブ参照が他にない場合、GCの実行時にそれらもGCされます。

呼び出しSystem.gc()は、gcが即座に実行されることを保証するものではありません。実行される場合と実行されない場合があり、保証はまったくありません。

And There is no guaranteed way to force gc run immediately as you request it.

はい、gcがメモリを解放して実行すると、その効果を確認できます。

視覚的なグラフ/情報を表示するには...ヒープ/メモリの使用量について、jdkツールを使用して、次の場所でWindows用に検索できます。

JAVA_HOME\bin\jconsole.exe 
于 2012-06-11T16:10:34.620 に答える
1
  1. nullに設定すると、はいGC、メモリが必要になったときにメモリの割り当てを解除するように指示されます。ただし、これは、そのオブジェクトを参照するインスタンスがこれ以上ない場合にのみ発生します。

  2. オブジェクトを参照しているインスタンスがまだある場合、そのオブジェクトを参照しているインスタンスが完全になくなるまで、GCは実行されません。したがって、B()とC()は、A()がそれらを参照している唯一の場合にのみGCされます。

  3. この効果は、Javaを使用してスキャナーで巨大なテキストファイル(約3 MB)を読み取り、スキャナーを閉じて破棄し、完了したらSystem.gc()を呼び出すことで簡単に確認できます。

于 2012-06-11T16:07:56.467 に答える
1

GC にオブジェクトの削除を強制することはできません。GC は、安全に削除できるオブジェクトを自動的に削除します。を呼び出して GC を強制的に実行できます。これによりSystem.gc()、可能なオブジェクトはすべて削除されます。

A = nullそのオブジェクトへの他の参照が存在しない場合にのみ、オブジェクトを削除します。

一般に GC が存在するため、削除やメモリ コレクションについて心配する必要はありません。安全に削除できるものは、最終的に削除されます。

B()それらを指すのをやめ、そもそもそれらを指す唯一のものであったC()場合、それらは削除されます。AA

于 2012-06-11T16:06:00.400 に答える
1

そのルールの親指、that when an object has NO reference attached to it, its a toast for the Garbage collector to eat.

マーキング A null は、A を GC のトーストにします。A を指している参照が B と C への唯一の参照であった場合、これらはどちらもガベージ コレクションの候補です。

finalize は、オブジェクトがガベージ コレクションされるときに呼び出されるオブジェクト クラス メソッドです。

于 2012-06-11T16:57:27.023 に答える