Поскольку Java - это безопасный язык и платформа, память не освобождается. Также ассоциированные PhantomReference
s не будут выставлены в очередь на их ReferenceQueue
. VM только когда-нибудь вызовет finalize
на объект. В JVM Spec есть диаграмма хорошего состояния.
Обычно, если вы используете финализатор, вы должны оставить декларацию как @Override protected void finalize() throws Throwable
, чтобы не нарушать API. Еще лучше использовать защищенный финализатор, как в Effective Java 1st Ed.
Этот особый трюк попал в заголовки (из Сан-Хосе Меркурия, в любом случае), когда группа в Принстоне использовала его для создания пользовательского ClassLoader
из ненадежного кода. Хотя спецификация была слегка затянута (конструктор Object
должен закончить выполнение обычно до того, как финализатор может быть вызван - указан в J2SE 5.0, реализованном в Java SE 6), это все еще остается проблемной областью. Если вы разрабатываете API, убедитесь, что чувствительные классы не могут быть подклассами и сэкономить много горя.
+1 потому что это хороший вопрос, но я надеюсь, что это было просто интеллектуальное упражнение. ;) –
не волнуйтесь, это было :) –