Сборка мусора
Как только определено множество недостижимых объектов, сборщик мусора может освободить память, занимаемую ими, и оставить остальное как есть. Также можно после освобождения памяти переместить все или часть оставшихся объектов в другие области памяти, обновив вместе с этим все ссылки на них. Эти два варианта реализации называются, соответственно, "неперемещающим" и "перемещающим".
Получение ресурса есть инициализация
В Java, использующей сборку мусора, объекты, на которые ссылаются автоматические переменные, создаются при выполнении команды new, а удаляются сборщиком мусора, который запускается автоматически с неопределённой периодичностью. В Java нет деструкторов, которые будут гарантированно вызваны при выходе переменной из области видимости, а имеющиеся в языке финализаторы для освобождения ресурсов, кроме памяти, не подходят, так как неизвестно, когда объект будет удалён и будет ли удалён вообще. Поэтому об освобождении ресурсов программист должен заботиться сам. Предыдущий пример на Java можно переписать так:
Тут бремя явного освобождения ресурсов возложено на программиста, в каждом месте кода, где выполняется захват ресурса. В качестве синтаксического сахара в Java 7 введена конструкция «try-with-resources»: