2016-07-26 2 views
0

У меня возникает сомнение относительно жизни объекта, который создается внутри определения метода. Насколько я знаю, вся жизнь переменной, локальная для метода, заканчивается завершением этого метода. Поэтому, если я создам объект внутри метода, он будет уничтожен после выполнения этого метода.Жизнь объекта, созданного в определении метода

+1

Объект будет собирать мусор в какой-то момент после того, как больше ссылок на него не существует. Это не обязательно точно в момент потери последней ссылки. – pvg

+0

Ok thanks ** @ pvg ** –

ответ

2

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

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

Raymond Chen написал прекрасное сообщение в блоге об этом When is an object eligible for garbage collection? Речь идет о C#, а не Java, но применяются аналогичные принципы.

+0

Также релевантно http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html # escapeAnalysis в том, что в случаях, аналогичных тому, что описано в вопросе, сбор и сбор мусора может быть полностью исключен. – pvg

+0

Большое спасибо ** @ Daniel Pryden ** –

3

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

Фактическое время уничтожения объекта (сбор мусора) зависит от других факторов, таких как общее потребление памяти для приложения.

+1

Вы действительно не знаете, что произойдет с объектом, когда оно больше не будет жить - это сильно зависит от типа используемого GC. Разумеется, нет требования, чтобы объект был «помечен» для GC, как только конечная ссылка выходит за рамки. Во многих случаях в этот момент ничего не произойдет. – pvg

+0

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

+0

@ DanielPryden: Вы имеете в виду, когда вы назначаете «null»? – npinti

1

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

Например у вас есть класс экземпляра типа (только псевдо)

class A { 

    } 

    class B { 
    A a; 

    public B() { 

    } 

    public void init(){ 
     A a = new A(); 
     this.a = a; 
    } 

    public void destroyA() { 
     this.a = null; 
    } 

    } 

    class C { 
    B b; 

    public C(){ 
     this.b = new B(); 
     b.init(); 
    } 
    } 

Мы создаем локальную переменную A и присвоить ему глобальную ссылку, так что даже после выполнения инициализации он будет содержать ссылку. Как только вызов destoryA() называется ссылкой, будет аннулирован.

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