2013-11-16 5 views
0

Это может быть очень наивный вопрос?Сбор мусора и незавершенный объект

Пусть у меня есть класс-то вроде этого

class SlowConstructor { 

    private final int a; 
    private final String unReachableString; 

    public SlowConstructor(String random) { 
      unReachableString = "I am not reachable will GC will collect me " + random; 
      Thread.sleep(1000*3600); // ignoring Exception check for readbility 
      a = 100; 
      Thread.sleep(1000*3600); 
    } 
} 

Итак, мой вопрос, если я создать многие объекты SlowConstructor (скажем 50 в дифф потоков) и, как вы можете видеть каждый конструктор займет два часа, чтобы закончить , Ссылка на String в SlowConstructor unReachableString недоступна из любого кода в течение двух часов. Если GC работает в течение этих двух часов, он не будет собирать unReachableString ref?. Я предполагаю, что это не будет сбор мусора, но почему? Откуда: unReachableString можно добраться?

+0

Возможный дубликат: http://stackoverflow.com/questions/19896866/is-unused-object-available-for-garbage-collection-when-its-still-visible-in-sta – maaartinus

+0

нет его не дублируется .. вопрос связан с возможностью GC для данных объектов, ссылка на которые еще не опубликована. – veritas

+0

Согласен, и ответ дает понять. – maaartinus

ответ

1

Ссылка на String в SlowConstructor unReachableString недоступна из любого кода в течение двух часов.

Неверный. Объект SlowConstructor является немедленно доступен из потока, который находится в процессе его создания. Итак, это строка.

Это означает, что объект String не будет собираться мусором до завершения конструктора.

(И фактически, строковый объект соответствует строковому литералу, и поэтому также доступен из кода (любого кода!), Который присваивает или применяет метод к литералу.)


Концепция достижимости включает в себя любой механизм, с помощью которого любого текущего или будущего исполнение может использовать объект в вопросе. Это включает случаи, когда объект не был присвоен именованной переменной или элементу массива ... пока.

+0

спасибо, String был просто, к примеру. Итак, вы говорите, что нить содержит ссылку на SlowConstructor только на то, что мы не можем получить доступ к этой ссылке программно? – veritas

+0

спасибо Стивену, я знаю, что у меня что-то не хватало. Спасибо за освобождение. – veritas

+0

@veritas - да. Вот что я говорю. В этом случае ссылка не доступна программно **, но ** ... но она ** будет **, и, следовательно, она достижима. –

0

До тех пор, пока потоки не будут прерваны, ваш объект будет (в конечном итоге) создавать экземпляр и (в конечном итоге) содержать значение для unReachableString.

Струны interned, и они будут подлежать сбору мусора только в том случае, если об этом ничего не говорится - вроде как работает сбор мусора. Полустроенный объект делает, ссылаясь на интернированную строку, поэтому она не будет пригодна для сбора мусора.

Я готов поспорить, что наличие пятидесяти одинаковых экземпляров этого типа, плавающих вокруг *, тоже не изменило бы - у вас есть пятьдесят или около того ссылок на этот строковый литерал, и он еще не будет иметь право для сбора мусора, пока эти экземпляры не имеют права на сбор мусора.

*: О, БОЖЕ НЕТ ПОЖАЛУЙСТА НЕ ДЕЛАЙТЕ ЭТО В АКТУАЛЬНОМ КОД ПОЖАЛУЙСТА

0

Она и не должна быть собрана мусор. Спящая нить все еще живая нить.

Reachable в контексте GC означает следующее: если мы проходим через Stack мы найдем ссылку, ведущую на этот объект (объем памяти) на Heap.

В этом случае ответ да.

0

Ваша логика неверна, если поток все еще жив, он находится в области метода SlowConstructor. Поэтому JVM считает, что строка unReachableString может использоваться, поэтому Garbacge Collection не затрагивает эту ссылку.

В соответствии с кодом вы можете предположить, что unReachableString не используется, поэтому он должен быть собран Мусором, но JVM не имеет интеллектуальной логики, чтобы знать следующую. Он просто рассмотрит область применения метода и объекта.

1

Как и другие, GC не повлияет на полупостроенный объект. Но почему? GC обязательно исходит из максимального набора корневых указателей. Все, что может быть достигнуто из этих корней, «защищено» от GC. Это либо моя маркировка, как в сборщиках меток и стрелок, либо путем копирования на новое активное поколение (арена) в копировальном коллекторе. Корни состоят из стека времени выполнения, машинных (виртуальных или физических) регистров и глобальных указателей. Когда конструктор начнет работать, будет создан указатель на вновь выделенную запись. Либо он будет корнем, либо доступен из корня. Таким образом, GC не будет его собирать. Поскольку построенный экземпляр класса доступен из корня, так же как и строка, на которую вы ссылаетесь. Поэтому он также не может быть собран.

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