0

これがコードスニペットです。

method(){
    String s1="abc";
    String s2 = new String ("abc");
    s1=null;
    s2=null;
    --------
    ---------
     }

最後にs1 & s2オブジェクトは存在しますか? これらのオブジェクトが確実にガベージ コレクションされるようにするにはどうすればよいでしょうか。

4

5 に答える 5

0

問題がを確認する方法である場合、答えはかなり単純です。オブジェクトが確実にガベージ コレクションされることはありません。 これを読んで、ガベージ コレクションとは何か、またその理由を理解する方法を理解してください。

問題がコレクションのヒントである場合は、不要なオブジェクトのすべての参照を に設定してnullを呼び出しますSystem.gc()。これにより、コレクションが要求されます (強制ではありません)。この方法を使用してリリースされることが保証されるものは何もありませんが、多くの場合、これが最も近い方法です。

これらの行に沿って機密データまたは何かが含まれている可能性があるため、特に string に対してこれを行いたい場合は、配列のプリミティブ値を自由に変更して消去することができるためchar[]、 a ではなく a を使用してそのデータを格納します。Stringやり直した。

于 2013-05-08T17:01:14.810 に答える
0

文字列 s2 = 新しい文字列 ("abc"); ここで、「abc」は通常のガベージ コレクション可能なヒープ領域に作成されます。したがって、S2 を null にするとすぐに、この文字列オブジェクトはガベージ コレクションの対象になります。これは、プログラムがこの特定の文字列オブジェクト「abc」への他の参照を持っていないことを前提としています。

文字列 s1="abc"; この場合、「abc」は、リテラル プールまたは文字列プールと呼ばれるヒープの特別な領域に作成されます。"abc" を null にしても、"abc" はガベージ コレクションの対象になりません。これは、JVM が将来この "abc" を再利用しようとするためです。この場合のベースラインは、通常のガベージ コレクション ルールはここでは適用されないということです。

これが役に立ったことを願っています。:-)

于 2013-10-09T06:01:50.477 に答える
0

ガベージ コレクターは定期的に実行されます (期間は JVM に依存します)。Java は、参照が壊れている場合 (おそらく参照に null を割り当てることによって)、オブジェクトのテーブルとその参照を維持し、次に GC (ガベージ コレクター) を実行すると、参照のないオブジェクトは削除されます (GC で問題が発生した場合、オブジェクトはガベージ コレクションされません)。 - 非常にまれな状態)、これは完全に JVM に依存しています。次のコードを使用して、JVM にリクエストを送信して GC を実行できます (リクエストの処理は、ここでも JVM に依存します)。

Runtime.getRuntime().gc();

また

System.gc();

プログラマーは実行中の GC について心配する必要はありません。ほとんどの場合、JVM が GC の実行を処理します。ガベージ コレクタには多くの機能強化が行われています。Java (最新バージョン) には、より効果的に動作するサーバー スタイルのガベージ コレクターである G1 (ガベージ ファースト) コレクターが付属しています。G1 は、CMS (Concurrent Mark-Sweep Collector) の優れた代替品です。ガベージ コレクターについて詳しく知りたい場合は、次のページをお読みください。

[http://docs.oracle.com/javase/7/docs/technotes/guides/vm/gc-ergonomics.html][1] [http://docs.oracle.com/javase/7/docs/technotes /guides/vm/cms-6.html][2] [http://docs.oracle.com/javase/7/docs/technotes/guides/vm/par-compaction-6.html][3]

于 2013-05-08T17:20:36.970 に答える