Евгений Матюшкин (skipy_ru) wrote,
Евгений Матюшкин
skipy_ru

О сборке мусора и нетривиальных конструкциях

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

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/
Tags: gc, маленькие тонкости
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments