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