17

以下のコードでは、それamethodが呼び出されていることを前提としています。myObjectによって最初に参照されたオブジェクトがガベージ コレクションの対象となるのは、どのポイント/行ですか?

class Test {
  private Object classObject;

  public void amethod() {
    Object myObject = new Object();
    classObject = myObject;
    myObject = null;
  }
}

また、public、protected、default、classObjectまたはamethodstatic のアクセス修飾子があった場合、オブジェクトがガベージ コレクションの対象となるポイントに影響しますか? もしそうなら、それはどのように影響しますか?

  • 私が最初に考えたのは、Test オブジェクトがガベージ コレクションの対象である場合、オブジェクトはガベージ コレクションの対象であるということです。
  • しかし、もう一度。オプティマイザーは、classObject が読み取られないことを認識している可能性があります。その場合、classObject = myObject;最適化によって除外されmyObject = null;、ガベージ コレクションの対象となります。
4

7 に答える 7

21

オブジェクトへのすべての参照が破棄されるまで、オブジェクトはガベージ コレクションの候補になりません。Java オブジェクトは参照によって割り当てられるため、

   classObject = myObject;

ヒープ上の同じオブジェクトに別の参照を割り当てました。だからこの行

   myObject = null;

1 つの参照のみを取り除きます。myObjectガベージ コレクションの候補を作成するには、

  classObject = null;
于 2012-10-30T17:56:32.783 に答える
6

OCA Java SE 7から

オブジェクトがアクセスできなくなった場合、オブジェクトはガベージ コレクションの対象としてマークされます。これは、オブジェクトがスコープ外になった場合に発生する可能性があります。また、オブジェクトの参照変数に明示的な null 値が割り当てられているか、再初期化されている場合にも発生する可能性があります。

于 2015-08-17T16:31:36.807 に答える
3

他のコードがそれにアクセスできないため、プライベートオブジェクトがすぐにGCされる可能性があるというあなたの考えには、ある程度の牽引力がありますが、これはJavaメモリ管理の一般的なセマンティクスを台無しにします。たとえば、そのオブジェクトが実装されていfinalizeて、オブジェクトがいつガベージ コレクションの対象になるかが Java セマンティクスによって明確に示されている場合、仕様に反してそのファイナライザー メソッドを呼び出す必要があります。

また、オブジェクトが他のオブジェクトを参照する可能性があり、さらに複雑な結果が生じる可能性があることにも注意してください。null言うまでもなく、オブジェクトはリフレクションによっていつでも到達可能であり、コードがその割り当てを行うことができなかったとしても、フィールドが突然変更されることは意味がありません。

結論として、最適化のアイデアが全体像でうまくいかない理由はたくさんあります。

于 2012-10-30T18:05:46.437 に答える
0

以下のコードでは、amethod が呼び出されていることを前提としています。オブジェクトが最初に myObject によって参照され、ガベージ コレクションの対象となるのはどのポイント/行ですか?

高レベルのソース コードと、ガベージ コレクターが認識する低レベルの表現 (レジスタ、スタック、およびグローバル変数のグローバル ルート) との間に切断があるため、質問は無意味です。

「ガベージ コレクションの対象となる」というフレーズは、おそらく、ヒープに割り当てられたメモリ ブロックが到達不能になる時点を意味します。したがって、あなたの質問は、どのヒープが割り当てられ、生成されたコードが参照を保持する期間について多くの(疑わしい)仮定を立てることによってのみ答えることができます。

于 2013-01-06T11:07:23.290 に答える
0

同じオブジェクトに対して 2 つの参照を作成し、1 つの参照のみに null を与えているが、他の参照はまだオブジェクトを指しているため、ここではガベージ コレクションの対象となるオブジェクトはありません。

于 2012-10-30T17:58:02.847 に答える
0

保持myObjectしているためclassObject参照が維持されているTest)、インスタンスが解放/アンロードされるまで、it(classObjectを介して参照されるメモリ内のオブジェクト)はガベージコレクションに使用できません。

于 2012-10-30T17:58:02.680 に答える