Я рекомендую вам и вашему коллеге прочитать Правду о сборке мусора .
В самом начале написано следующее:
Спецификация для Java
Платформа дает очень мало обещаний о
как на самом деле работает сборка мусора. [Опущено]
Хотя это может показаться запутанным, факт
что модель сборки мусора
не жестко определено на самом деле
важный и полезный - строго определенный
модель сбора мусора может быть
невозможно реализовать на всех
платформ. Точно так же это может
исключить полезные оптимизации и вред
производительность платформы в
долгосрочный.
В вашем примере переменная test
становится "невидимой" (см. A.3.3 выше) в цикле while
. На этом этапе некоторые JVM продолжат рассматривать переменную как содержащую «жесткую ссылку», а другие JVM будут обрабатывать ее так, как если бы переменная была обнулена. Любое поведение приемлемо для совместимой JVM
Цитирование из издания 3 JLS (раздел 12.6.1, абзац 2):
Достижимым объектом является любой объект, который
могут быть доступны в любом потенциале
продолжение вычислений из любого живого
нить.
Обратите внимание, что достижимость вообще не определяется с точки зрения областей. Цитируемый текст продолжается следующим образом:
Оптимизация преобразований
может быть разработана программа, которая уменьшает
количество объектов, которые
достижимы, чтобы быть меньше, чем те, которые
будет наивно считаться достижимым.
Например, компилятор или код
генератор может выбрать для установки переменной
или параметр, который больше не будет
используется для обнуления, чтобы вызвать хранение для
такой объект может быть потенциально
исправим раньше.
(Мое выделение добавлено.) Это означает, что объектный объект может быть собран мусором, и финализация может произойти раньше или позже, чем вы ожидаете. Стоит также отметить, что некоторым JVM требуется более одного цикла GC, чтобы завершить работу с недоступными объектами.
Суть в том, что программа, которая зависит от финализации, происходящей раньше или позже, по своей сути непереносима, и, на мой взгляд, глючит.