2017-01-21 8 views
0

ため、古いオブジェクトを選択し、新しいStringオブジェクトがStringsはJavaで不変であるように変形し、新たな文字列を格納するために作成されます。しかし、どのオブジェクトが新しいオブジェクトを作成するのか、どちらがガベージコレクションの対象になるのかはわかりません。は、新しいオブジェクトを作成し、以下のコードでは、ガベージコレクション

String s1 = "It"; 
String s2 = "was"; 
String s3 = s1+" "+s2; 
s2+=" roses"; 
s3 = s3+s2+" roses all the way"; 
System.out.println(s3); 

答えて

0

コードスニペットの範囲によって異なります。

すべてのコードが1つのメソッド内であれば、それらのすべては、実行後にゴミになります。

ガベージコレクタは、オブジェクトへの参照の数に基づいて動作します。

例として、あなたは、メソッド内で新しい参照String s1を宣言し、何かに割り当てます。その後、メソッドが実行され、完了時に参照がなくなります。だから、ごみに行ってください。これは簡単な、基本的な説明である

+0

:1.それはサイクルを扱うことができないだろうと(* *ガベージコレクションの可能な実装を(さんが言わせて)、私はそれは、Javaのために使用さについて聞いたことがないです*参照カウント*があります)。使用されたガベージコレクタは、正確な参照カウントについては何も知らない。彼らは参照されているかどうかしか知りません。 2.メソッドが完了すると、 '' It "'はすべての参照を失いましたが、それはリテラルプールのメンバーなので、誰も気にしません。 3.メソッドが終了したときに明示的なGCアクションはありません(反対の主張はしませんでしたが、それは私がそれを理解する方法です)。 – maaartinus

+0

@maaartinus - あなたが正しいと思います。しかし、「参照の数」または「参照されている」 - 違いは何ですか? count == 0は参照されていない:-)を意味します。本当に "誰が気にするの?"なので、特にストリングのためにそれにあまり注意を払ったことはありませんでした。 :-)私は、GCがオブジェクト(文字列ではありません)を先に破壊するように、nullへの参照を明示的に設定しなければならない場合がありました。 ...長い時間をバック... – Vadim

0

、実際の動作は、使用コンパイラと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の代替最適化する。誤解を招くようです

関連する問題