Санкт-Петербургская группа тестирования JVM


« Java и DTrace: новые... | Main | JavaOne 2006, день 1 »
20060516 вторник Май 16, 2006

Странности финализации

Пожалуй наиболее противоречивая и странно написанная часть The Java Language Specification - это часть про финализацию. Какие возникают вопросы и проблемы и почему?

Что такое финализация? Это вызов метода Object.finalize(), в котором можно попытаться сделать некоторые действия после того, как сборщик мусора определил, что объект недостижим, но перед тем, как память будет на самом деле освобождена.

Вот только некоторые странные вещи, которые на первый взгляд могут не совпасть с нашим интуитивным представлением.

Для чего может использоваться финализация?

Итак, финализаторы очень сильно отличаются от деструкторов в C++ и должны использоваться по-другому. В общем случае, как мне кажется стоит руководствоваться следующим правилом: если результат работы программы изменяется при убирании метода finalize(), то скорее всего следует отказаться от него и попытаться реализовать то же самое иным способом.

Н.Х.

опубликовал vmrobot ( май 16 2006, 12:52:48 AM MSD ) Permalink Комментарии [5]

Trackback URL: http://blogs.sun.com/vmrobot/entry/%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D0%B8%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8
Комментарии:

...какого-либо метода, но но перед его завершением... -->> ... но не перед его завершением... описка?

опубликовал denis Май 18, 2006 at 04:37 PM MSD #

Нет, не описка. Например, если поля объекта не используются до завершения метода, то ссылка this уже не нужна и оптимизатор может решить не сохранять ее на стеке или в регистрах. Это означает, что объект уже стал недостижим и его финализатор может выполниться. Этого не происходит, если метод что-то делает с полями объекта. А в 6295525 может произойти так, что ресурс освободится методом finalize() до того, как native-часть другого метода (которая не использует полей, а использует только handle).

опубликовал Nicolay Haustov Май 18, 2006 at 07:26 PM MSD #

И ни слова про PhantomReference

опубликовал Blazkowicz Декабрь 27, 2006 at 05:54 PM MSK #

Когда-то я писАл Connection Pool для базы данных. Если юзер забыл вернуть коннекшн в пул, за него это делал GC. Коннекшн имел переопределенную finalize(), которая закрывала ресурсы (транзакции, операторы), возвращала коннекшн обратно в pool и писала в лог сее событие. Таким образом, юзерский код не давал сбоев, а о забытых коннекшнах можно было посмотреть в логе.

опубликовал null Август 09, 2007 at 01:34 PM MSD #

В случае закрытия ресурсов:

Следует учитывать, что в Sun JDK если код методна finalize() зациклится, то никто из finalizer-ов больще не выполнится.

Память, занятая объектами в очереди на финалицию остается занятой.

Кроме того, момент финализации заранее неизвестен, так что может быть ситуация, когда кол-во соединений превысит лимит, например, сервера и для нового соединения надо будет ждать пока JVM финализирует старое.

опубликовал Kirill Shirokov Август 09, 2007 at 02:26 PM MSD #

Опубликовать комментарий:

Имя
E-Mail:
URL:

Ваш комментарий:

HTML Syntax: Отключен

Хиты страниц за сегодня: 26