、実際の動作は、使用コンパイラとJVMに基づいて異なる場合があります。また、このトピックに深く入り、より詳細な説明を提供できる多くの記事があります。
これらのリテラルは、JVMの文字列プールに置かれるとGC'edれることはありません。 (すなわち、それらはJVMの期間メモリに存在しています。
"It", "was", " ", " roses", " roses all the way"
その後、限り文字列の参照が懸念しているとして、それは変数のスコープに依存します。私はこの答えをローカルメソッドレベルを仮定します:
String s1 = "It"; // a reference will be created on the stack
String s2 = "was"; // a reference will be created on the stack
String s3 = s1+" "+s2; // a reference will be created on the stack for s3, and then two temp objects will be created in memory, one for s1+" ", one for concatenating the result with +s2. (this operation can vary greatly based on how compiler optimizes), the first one will become eligible for GC immediately.
s2+=" roses"; // same as above.
s3 = s3+s2+" roses all the way"; // same as above but the object s3 was pointing to will become eligible for GC immediately.
System.out.println(s3); // no memory allocation.
方法が終了すると、S1、S2、S3の参照がスタックからクリアされ、残りのオブジェクトがGCの対象になることを指摘し
希望これは、これは非常にであることを覚えている、ことができます。基本的な説明、私はどのように私はこのトピックを読んで、お勧め実際に動作するかどうかは、コンパイラが最適化する方法によって大きく異なる場合があります。 (例えば、コンパイラはこれらのすべての一時的な参照を参照し、連結を必要とせず、それらを破棄することがあります)
注:文字列を作成するために連結しているので、StringBufferやStringBuilderのようなMutableの代替最適化する。誤解を招くようです
:1.それはサイクルを扱うことができないだろうと(* *ガベージコレクションの可能な実装を(さんが言わせて)、私はそれは、Javaのために使用さについて聞いたことがないです*参照カウント*があります)。使用されたガベージコレクタは、正確な参照カウントについては何も知らない。彼らは参照されているかどうかしか知りません。 2.メソッドが完了すると、 '' It "'はすべての参照を失いましたが、それはリテラルプールのメンバーなので、誰も気にしません。 3.メソッドが終了したときに明示的なGCアクションはありません(反対の主張はしませんでしたが、それは私がそれを理解する方法です)。 – maaartinus
@maaartinus - あなたが正しいと思います。しかし、「参照の数」または「参照されている」 - 違いは何ですか? count == 0は参照されていない:-)を意味します。本当に "誰が気にするの?"なので、特にストリングのためにそれにあまり注意を払ったことはありませんでした。 :-)私は、GCがオブジェクト(文字列ではありません)を先に破壊するように、nullへの参照を明示的に設定しなければならない場合がありました。 ...長い時間をバック... – Vadim