1

基本的に、現在オブジェクトを使用しているスレッドの数を知りたいです。誰もこのオブジェクト参照を使用していない場合は、このオブジェクトを破棄したいと考えています。

 User u = new User();
 (here I have other code) 
 if (u is not used by any thread) {
   u = null;
 }
4

1 に答える 1

6

この質問は、Java メモリ管理の根本的な誤解に基づいています。

変数nullへの割り当ては、以前に参照したオブジェクトを破棄しません。実際行うことは、「到達可能」にするオブジェクトへのおそらく多くのパス (ライブ変数からの参照のチェーン) の 1 つを切断することです。パスが存在しなくなると、オブジェクトはプログラム内で到達 (使用) できなくなり、ガベージ コレクションの対象となります。実際にいつ消えるかは、JVM / ガベージ コレクターの裁量です。

User他に何も参照されていないときに、オブジェクトを「立ち去らせよう」としています。しかし、それはとにかく起こります。本当に必要なのは、この変数が User オブジェクトの消失を止めないように、無条件に割り当てるnullことだけです。u

Userオブジェクトを「今すぐ」消えさせることができますか? 答えは複雑で、要約すると次のようになります。

  • あなたはそれを確実に行うことができず、
  • 効率的に行うことはできません。

そして、質問タイトルの質問に答えます。

現在オブジェクトを使用しているスレッドの数を調べる方法はありますか?

いいえ、あなたが意味する意味ではありません。JVM は、オブジェクトの参照のライブ コピーがいくつあるかを調べる方法さえ提供していません。JVM がこれを提供するのに最も近いのは、オブジェクトへの通常の (強い) 参照がなくなったことを検出するために使用できるSoftReferenceおよびクラスです。WeakReference

しかし、これはあなたの「問題」を解決するために必要ではありません。

于 2013-01-27T00:35:51.687 に答える