Я читал Производительность платформы Java (к сожалению, ссылка, похоже, исчезла из Интернета, так как я изначально задавал этот вопрос) и раздел A.3.3 беспокоит меня.
Я работал над предположением, что переменная, которая выпала из сферы действия, больше не будет считаться GC-корнем, но эта статья, похоже, противоречит этому.
У недавних JVM, в частности версии Sun 1.6.0_07, все еще есть это ограничение? Если это так, тогда у меня есть много кода для анализа...
Я задаю вопрос, потому что статья с 1999 года - иногда вещи меняются, особенно в мире GC.
Поскольку документ больше не доступен, я хотел бы перефразировать проблему. В документе подразумевалось, что переменные, которые были определены внутри метода, будут считаться корнем GC до тех пор, пока метод не завершится, и только до тех пор, пока блок кода не закончится. Поэтому установка переменной в значение null была необходима, чтобы объект, на который делается ссылка, был собран мусором.
Это означало, что локальная переменная, определенная в условном блоке в методе main() (или подобном методе, содержащем бесконечный цикл), вызовет одноразовую утечку памяти, если вы не перемените переменную непосредственно перед ее выпадением из области.
Код из выбранного ответа хорошо иллюстрирует проблему. В версии JVM, указанной в документе, объект foo не может быть собран в мусор, когда он выпадает из области видимости в конце блока try. Вместо этого JVM будет удерживать ссылку до конца метода main(), даже если это невозможно для использования этой ссылки.
Это, по-видимому, является источником идеи о том, что обнуление ссылки на переменные помогло бы сборщику мусора, даже если переменная должна была выйти из области видимости.