Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Может ли gc удалить только что созданный объект до присвоения переменной?

#java #сборщик_мусора


Допустим у нас есть такая строчка:

Object object = new Object()


Сценарий:


Был создан объект new Object(), но ссылка него еще не была присвоена переменной object. 
Был вызван GC. На наш объект нет
ссылки и он его удаляет. 
Переменная object остается без объекта.


Не думаю, что такое возможно, но не понимаю почему.
    


Ответы

Ответ 1



Потому что ссылка есть всегда. Ну сами подумайте, если сразу после окончания работы конструктора ее нет, то что мы потом присваиваем в переменную? Если вы посмотрите на байт-код создания объекта, то увидите что-то вроде 0: new #2 // class java/lang/String // память заказана, ссылка на неициализированный объект положена в стек операндов 3: dup // ссылка раздублирована 4: invokespecial #3 // Method java/lang/String."":()V // один экземпляр ссылки передан параметром в конструктор и там пропал 7: astore_0 // второй экземпляр записали в локальную переменную вот эти ссылки, лежащие в стеке операндов, так же учитываются сборщиком мусора, как и ссылки из переменных.

Ответ 2



Насколько я понял вопрос, речь идет о том, что: может ли мусорщик убрать объект между моментом его создания и присвоения к переменной Ответ, нет не может. Идеология работы сборщика мусора в Java примерно такая (псевдокод): void allocMemory(int n) { //просьба аллокации n байт из кучи if (heapTop - heapStart > n) //проверяем есть ли место в куче сollectGarbage(); //вызываем сборщик мусора heapStart += n; //обновляем указатель на начало свободной кучи } Соответственно сборка мусора будет происходить только перед созданием объекта, но не после него. Понятно, что в реале все по другому, учитывая фрагментацию кучи и многопоточность, но в целом псевдокод приблизительно такой. P.S. Вызов System.gc() - это не вызов сборщика мусора, а всего лишь просьба прибрать мусор

Ответ 3



Нет, такое невозможно. Ситуацию "переменная осталась без объекта" вы никогда не сможете увидеть, поскольку сборщик мусора спроектирован так, чтобы эту ситуацию вы никогда не увидели. На самом деле, переменная "без объекта" остаться может - но только в том случае, когда вы никогда эту переменную не читаете (а значит, и не сможете увидеть собрал её сборщик мусора или нет)

Комментариев нет:

Отправить комментарий