2013-04-07 1 views
0

Для этого фрагмента кода:Могу ли я понимать памяти Утечки правильно в Java

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

Там не будет утечки, так как все ссылки на 100 объектов были установлены в нуль, таким образом, они будут собраны 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 правильно, спасибо заранее!

+2

Вы не должны устанавливать ссылки на нуль. GC намного умнее, чем мы знаем, когда что-то может быть очищено. – duffymo

ответ

3

В первом примере v по-прежнему содержит ссылки на 100 объектов. Когда v выйдет из сферы действия, он станет кандидатом на сбор мусора, когда он будет собран, все 100 объектов могут быть собраны также.
Во втором примере - если вы установили v в null, это будет кандидатом на сбор мусора, когда он будет собран, все 100 объектов могут быть собраны также.
Таким образом, в обоих случаях утечки не должно быть.

Как правило, нет необходимости в установке локальной переменной в нуль, когда метод заканчивается, он выйдет из области действия и будет подвергаться GC.

0

Ссылки на объект 100 не остаются. 'o', очевидно, выходит за пределы области на каждой итерации цикла for, оставляя только ссылку, внутреннюю для вектора (o=null в вашем первом случае бессмысленно). Когда вы устанавливаете v на что-то еще (null), больше нет ссылки на вектор, поэтому он и его содержимое могут быть собраны в мусор.

Вот что такое «подсчет ссылок»; это число действует оставшихся ссылок. Вы не можете потерять их, так как вы можете потерять указатель на C. Если область действия ссылки исчезла (например, потому что она локальна для функции), ссылка исчезла. Вам не нужно указывать значение null.

Смежные вопросы