2

すべての Java 開発者は、Java オブジェクトが使用されなくなるとガベージ コレクションされることを知っています。JVM がガベージ コレクションのために選択する必要があるオブジェクトを識別する方法を知りたいです。(たとえば、10個のオブジェクトがある場合.10のうち、2つのオブジェクトがガベージコレクションされている場合、jvmがその2つのオブジェクトを見つける方法)。

JVMは「マークアンドスイープ」アルゴリズムを使用します(正しい場合)。

1)たとえば、以下の文字列オブジェクトのシナリオを提供します

  class Sample{

     public static void main(Strings args[]){
      String s1=new String("10");
      String s2=new String("20");
      String s3=new String("30");
      String s4=new String("40");
      String s5=new String("50");
      String s6=new String("60");
      String s7=new String("70"); 

        s1=null; //now s1 is eligible for gc collection
        s2=null; //now s2 is eligible for collection


 }
}

//s1 と s2 は gc コレクションの対象となります。null 参照 (s1、s2) を明示的に作成するとnullになりますが、ヒープに割り当てられたメモリはどうなりますか? それはfreedupでしょうか?

4

6 に答える 6

2

実際には何も起こりません。s1 と s2 によって使用されるメモリは、GC が動作を開始したときにのみ再利用されます。これは、JVM が決定したときにのみ発生し、発生しない可能性があります。あなたの場合、GC はほとんど起動しません。

于 2013-10-03T06:19:45.843 に答える
1

ライブ スレッドが何らかの方法でオブジェクトにアクセスできない場合、そのオブジェクトはガベージ コレクションの対象になります。ただし、GC は JVM の内部ロジックとアルゴリズムに依存するため、GC が実行される保証はありません。一般に、JVM がメモリ使用量をいくらか解消する時が来たと判断したときに発生します。あなたの場合、s1 と s2 は GCed の資格がありますが、それがいつになるかはわかりません。

于 2013-10-03T06:49:35.463 に答える
1

参照に割り当てnullても、メモリは解放されません。ガベージコレクターを使用して参照を削除できるようにするだけです。これで、ガベージ コレクターの実行時に、この参照割り当てメモリを解放できるようになりました。

于 2013-10-03T06:15:44.530 に答える
0

Java オブジェクトは、そのオブジェクトの参照カウントが 0 の場合にガベージ コレクションの対象となります。参照カウントが 0 であるということは、「その特定のオブジェクトがどの変数からも参照されていないため、それ以上使用できない」ことを示します。ガベージ コレクターは、最初のパスで参照カウントが 0 であるすべてのオブジェクトをマークし、2 番目のパスでマークされたすべてのオブジェクトをスイープします。したがって、それはマークアンドスイープアルゴリズムです。

それはfreedupでしょうか?

s1 と s2 を null にした後にガベージ コレクターが再実行されると、ガベージ コレクターに依存します。ただし、参照を null にしても、すぐにオブジェクトがメモリから解放されるわけではありません。

于 2013-10-03T06:20:26.500 に答える
0

オブジェクトは、ライブ スレッドまたは静的参照から到達できない場合、ガベージ コレクションまたは GC の対象になります。

ここを見る

于 2013-10-03T06:12:54.197 に答える