У меня возникает сомнение относительно жизни объекта, который создается внутри определения метода. Насколько я знаю, вся жизнь переменной, локальная для метода, заканчивается завершением этого метода. Поэтому, если я создам объект внутри метода, он будет уничтожен после выполнения этого метода.Жизнь объекта, созданного в определении метода
ответ
Объект станет подходящим для сбора мусора, как только среда выполнения может доказать, что он больше никогда не будет доступен. Фактически это будет собрано когда-нибудь после этого, когда время выполнения найдет его удобным.
Обратите внимание, что объект жизни не регулируется объема, который является синтаксической конструкцией, но достижимости. Объект может перестать быть достижимым, пока метод все еще выполняется (например, когда не выполняется строка кода, которая касается объекта), или она может продолжаться до досягаемости после возвращения метода (например, если ссылка объект хранится в статическом поле или возвращается из метода).
Raymond Chen написал прекрасное сообщение в блоге об этом When is an object eligible for garbage collection? Речь идет о C#, а не Java, но применяются аналогичные принципы.
Также релевантно http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html # escapeAnalysis в том, что в случаях, аналогичных тому, что описано в вопросе, сбор и сбор мусора может быть полностью исключен. – pvg
Большое спасибо ** @ Daniel Pryden ** –
После того, как это выполнение выходит за пределы области, в которой был создан объект, или выполняется другая операция присваивания, и ссылки на упомянутый объект отсутствуют, среда выполнения отметит этот объект для сбора мусора (что означает, что объект может все еще быть там, больше не доступны).
Фактическое время уничтожения объекта (сбор мусора) зависит от других факторов, таких как общее потребление памяти для приложения.
Вы действительно не знаете, что произойдет с объектом, когда оно больше не будет жить - это сильно зависит от типа используемого GC. Разумеется, нет требования, чтобы объект был «помечен» для GC, как только конечная ссылка выходит за рамки. Во многих случаях в этот момент ничего не произойдет. – pvg
Этот ответ неверен: объект может стать подходящим для GC, в то время как ссылка на него все еще находится в области видимости, пока среда выполнения может доказать, что эта ссылка больше никогда не будет считана. –
@ DanielPryden: Вы имеете в виду, когда вы назначаете «null»? – npinti
Это зависит от локальной переменной. Если локальная переменная назначена глобальной области действия, она не будет уничтожена до тех пор, пока глобальная область не будет аннулирована.
Например у вас есть класс экземпляра типа (только псевдо)
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() называется ссылкой, будет аннулирован.
- 1. жизнь объекта, созданного с помощью конструктора копирования
- 2. Жизнь объекта Java
- 3. Слияние метода класса в определении
- 4. Вызов метода для объекта, созданного другим методом?
- 5. объекта доступа в определении объекта
- 6. Жизнь объекта внутри Action MVC
- 7. жизнь и смерть объекта объяснения
- 8. Как ссылаться на структуру данных объекта в определении вложенного метода?
- 9. вызов метода в определении класса?
- 10. Имя метода упаковки в определении
- 11. Предупреждение при определении метода
- 12. Возвращение объекта, созданного в родной функции для Java-метода
- 13. Тип объекта, созданного ListCollectionView.AddNew
- 14. Что такое^в определении объекта?
- 15. Создание объекта в определении класса
- 16. Создайте объект в определении объекта
- 17. функции Стрелка в определении объекта
- 18. частный [это] в определении объекта
- 19. Ошибка в определении объекта DataSetIterator
- 20. изменение побочного эффекта метода макетного объекта, созданного с помощью патча
- 21. Как вызвать метод уже созданного объекта из метода другого класса?
- 22. Область Java: возврат объекта, созданного внутри метода. Это опасно?
- 23. Вызов методов объекта, созданного одним методом, из другого метода
- 24. Сбой при выпуске объекта, созданного с использованием метода initFromFile
- 25. Создание созданного объекта в python
- 26. Прямая функция создания при определении метода
- 27. Перемещение созданного объекта игры
- 28. Идентификатор последнего созданного объекта
- 29. Может ли доступ к частному члену нового объекта изнутри метода в определении класса этого объекта?
- 30. Добавление перегрузки статического метода в определении машинопись
Объект будет собирать мусор в какой-то момент после того, как больше ссылок на него не существует. Это не обязательно точно в момент потери последней ссылки. – pvg
Ok thanks ** @ pvg ** –