2010-11-19 8 views
6

ガベージコレクタによってオブジェクトをフェッチできるかどうかを確認する方法はありますか? Eclipseのデバッガを経て、私はオブジェクトのメモリ位置を取得し、オブジェクトがガベージコレクタによってフェッチできるかどうかを確認してください

MyObject mo = myObject; 

その後:

はどこか私のコードで私は、オブジェクトへの参照を持っています。その後、私は参照ヌルを設定します。

mo = null; 

は、以前に参照されたオブジェクトは、現在ガベージコレクションに適しているか、それを別の参照がどこかにあるかどうかどうかを確認する方法はありますか?

どうもありがとう、

ステファン

答えて

13

実行時に任意のオブジェクトでこれを実行することはできません。実際には、これを確定的に行うことは完全には不可能です。しかし、ニーズに応じて、適切である2つのオプションがあります。

  1. あなたはnullへの参照を設定した後、ヒープ・ダンプを取り、そしてそのようなjhatなどヒープ・アナライザ・ツールまたはプロファイラでそれを読み込みますこれをサポートします。これらのツールを使用すると、GCルートからパスをたどって、オブジェクトがまだ到達可能かどうかを確認できます。
  2. PhantomReferenceのオブジェクトを指定してReferenceQueueにラップします。参照がエンキューされると、オブジェクトがガベージコレクションされたことがわかります。 (残念ながら、参照がキューに入れられていない場合、オブジェクトにまだ到達可能である可能性があります。または、GCがまだオブジェクトを検査していないことが原因である可能性があります。全体的に)

しかし、私は最良の選択肢は、メモリリークの問題の意識こと、それらを避けるために、アプリケーションを設計することであることに同意します。メモリリークが発生している場合は、十分なはずです。そして、問題を発見するためにエネルギーを集中させることができます(不正に到達できないオブジェクトのヒープをダンプして分析することによって)。

上記の手順は比較的時間がかかりますが、変更するたびに行うことではなく、固有のの問題を調査するためのツールです。

+0

それは私たちが記憶上の問題を経験したhuuuuuuuuuuuuuugeアプリケーションです。 1つの最適化が改善につながるはずですが、期待したほどのものではありません。したがって、特定のオブジェクトがガベージコレクションされているかどうかを知りたいと思っています。あなたの返信をありがとう、私はそれを試してみましょう! – swalkner

+0

あなたは純粋なごみを得るでしょう:D – delive

1

第行うための唯一の事は気をつけて、アプリケーションを書くときにメモリリークがJavaで存在できることを心に留めておくことです。

このような問題に気付いたときにメモリリークが発生した場所を見つけるためにツールを使用することができます。このためにはMemory Analyzerを強くお勧めします。

+0

ご返信ありがとうございます!もちろん気をつけることが最も重要なことですが、時にはそれだけで十分ではありません(andrzey doyleへの回答を参照) – swalkner

関連する問題