2015-03-29 2 views
2
class Test 
{ 
    public static void main(String[] agrs) 
    { 


    String[] person = new String[20]; 

    String pername = "Peter"; 

    person[0] = pername; 

    pername = null; 

    System.out.println(person[0]);  // prints " Peter " on screen 

    System.out.println(pername);  // no content in pername. prints " null " 


    } 

} 

Объект pername, подходящий для сбора мусора?
Я думаю, что он имеет право, потому что человек [0] содержит «Питер», а человек [0] больше не ссылается на имя.объекты, имеющие право на сбор мусора в java

ответ

2

Небольшое недоразумение здесь. pername или person[0] - это просто ссылки на фактический экземпляр объекта String. Ссылка в реальном времени на стек и будет находиться в стеке, пока он не будет в контексте программы. Экземпляр String не будет GCed, если обе ссылки не равны нулю.

Любые объекты, доступные из корней GC, не могут быть собраны в мусор. Простая программа Java будет иметь следующие GC корни

  1. Локальные переменные в главном методе
  2. Основной поток
  3. Статические переменные основного класса

Ваш случай подпадает под 1-й категории.

Вы можете прочитать больше - Java Memory Management

+0

но pername завершил свой job..it не имеет ничего общего после присвоения ему нулевой – blue

+0

Да, я говорю, что это просто ссылка. И 'pername', и' person [0] 'указывают на тот же экземпляр String в кучевой памяти. Даже если вы сделали точку «pername» равной нулю, 'person [0]' все еще указывает на исходный экземпляр String и, следовательно, не будет gced. Ссылка 'pername' останется в стеке до конца вашего основного метода. Вы можете указать его на какой-то другой экземпляр String. –

+0

Это будет сбор мусора, но вы не знаете, когда это произойдет, потому что у gc есть собственный алгоритм и gc, кстати довольно сложный ... – andy007

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