長い仕事をしているメソッドがある場合 (たとえば、Web サービス呼び出しを行う)、ガベージ コレクターはメソッドが使用するメモリを調べて、異なる世代に移動しますか、それとも終了するまでメソッドを無視しますか?その後、後のデータでメモリを収集しようとしますか?
Web サービスの呼び出しが行われている場合、GC がそれを調べ、時間がかかるため、ジェネレーション 1 とマークし、次にジェネレーション 2 とマークするという説明を聞きました。後の段階まで収集されません。これは正しいです?
長い仕事をしているメソッドがある場合 (たとえば、Web サービス呼び出しを行う)、ガベージ コレクターはメソッドが使用するメモリを調べて、異なる世代に移動しますか、それとも終了するまでメソッドを無視しますか?その後、後のデータでメモリを収集しようとしますか?
Web サービスの呼び出しが行われている場合、GC がそれを調べ、時間がかかるため、ジェネレーション 1 とマークし、次にジェネレーション 2 とマークするという説明を聞きました。後の段階まで収集されません。これは正しいです?
GCが起動すると、オブジェクトのルートが調べられます。それらのルートがメソッド変数からのものか、インスタンス/静的フィールドからのものかは関係ありません。メソッドが終了するまでこれらの参照は有効であるため、メソッドから参照されているリソースは解放されません。
メソッドは GC から直接見えません。
ガベージコレクターはメソッドを探しません。GCは参照をチェックします。
簡単な例:グローバル変数を定義すると、スコープのすべての関数からアクセスできます。スコープを離れるまで収集されません。ローカル変数を定義する場合、たとえば関数内で、この変数によって使用されるメモリは、関数が戻った後(またはfinally
、try / catchブロックから戻った場合はブロック)にクリアされます。