0

このコード フラグメントの場合:

Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      o = null;
     }

100 個のオブジェクトへのすべての参照が null に設定されているため、リークは発生せず、GC によって収集されます。

でも、

 Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      }
   v= null;

ベクトルへの参照を無効にしただけなので、リークが発生しますが、100 個のオブジェクトへの参照はすべて残っているため、システムにとって役に立たない間は GC が収集されません。

Java でのメモリリークを正しく理解しているかどうかを調べるのを手伝ってください。よろしくお願いします!

4

2 に答える 2

0

100 オブジェクトへの参照は残りません。「o」は、forループの各反復で明らかに範囲外になり、ベクトルの内部参照のみを残しo=nullます(最初のケースは無意味です)。他の何か (null) に設定vすると、ベクターへの参照がなくなるため、ベクターとその内容をガベージ コレクションできます。

それが「参照カウント」です。残り の有効な参照の数です。C でポインターを解放できるように それらを解放することはできません。参照のスコープがなくなった場合 (たとえば、関数に対してローカルであるため)、参照はなくなります。null に設定する必要はありません。

于 2013-04-07T12:27:01.003 に答える