?

Log in

Previous Entry | Next Entry

Наткнулся на такой вопрос. Какая принципиальная разница между следующими фрагментами кода?

MyObject o;
o = new MyObject();
o = new MyObject();

MyObject o;
o = new MyObject();
o = null;
o = new MyObject();

Я в первый момент сказал – никакой. Оказалось, разница есть, – с точки зрения сборки мусора.

Представьте себе, что у нас высокое потребление памяти. Так, что на второй объект MyObject ее может не хватить. Что происходит:

В первом случае – мы создаем один объект, пытаемся создать второй, памяти не хватает, запускается GC, памяти все равно не хватает, OutOfMemory.

Во втором случае – мы создает один объект, обнуляем ссылку, пытаемся создать второй, памяти не хватает, запускается GC, собирает первый объект, памяти хватает, она выделяется под второй объект, он создается.

То есть разница в том, в какой момент первый объект становится доступен для сборки – до или после создания второго объекта.

Забавно, раньше не задумывался над такой тонкостью.

Источник: http://habrahabr.ru/post/132500/

Comments

( 2 comments — Leave a comment )
mjol1nir
Jul. 10th, 2013 10:15 am (UTC)
Есть такой момент.
Выяснил опытным путём, когда под Андроид писал, и приходилось каждый байт экономить.
dark_barker
Jul. 10th, 2013 10:39 am (UTC)
аналогично, в javame такое обнуление указателей - обычная очень распространённая практика была
( 2 comments — Leave a comment )