|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
Почитал материала на тему. Хочу тезисно всё уложить в голове на эту тему. Жду исправлений, добавлений. Это метод класса Object. Вызывается только у объектов у которых он переопределён, это происходит перед тем как GC освободит мусор. Изначально предназначен для очистки каких-нить системных ресурсов. Ни один человек в здравом уме им пользоваться не будет по следующим причинам(Хотя в ждк классах где-то есть его использования): 1. Добавляется лишний цикл работы GC( https://habr.com/post/144544/#comment_9863442) для того, чтобы убрать объект. Честно, я не понял почему. 2. Поток финализации один. То есть есть один консумер который в одном потоке вызывает finalize(). Если один затормозил, то начинает тормозить весь процесс сборки мусора. Но тут можно сделать хак и написать System.runFinalization() и тогда все не финализированные объекты из очереди будут исполняться в новом потоке, а тормозящий будет тормозить в старом потоке. 3.Можно воскресить объект если засетать this внутри finalize. При этом когда он таки помрёт финализатор не вызовется дополнительно. 4.Какая-то херь с наследованием( https://habr.com/post/144544/#comment_9863442). Обязательно надо чтобы именно в этом классе был переопределён finalize даже если он переопределён в родителе. 5. Finalize вызовется хрен знает когда. А может и никогда, если программа закончится до очистки мусора. 6.У Блоха написано в книге что finalize() замедляет работу GC по очистке объекта в 430 раз. Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 19:43 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
Petro123questioner, Дубль тема https://habr.com/post/183344/ Ну и не используй его в своей практике. Эту статью тоже читал. Надо знать, что ответить на собесе) Понятно, что это никто не использует. Ещё забыл 7. Все эксепшены выброшенные внутри этого метода исчезнут бесследно. 8. С 9-ки он deprecated. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 20:20 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
У меня вот такой кусок кода вообще не вызывает финализацию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Видимо как обычно - без гарантий. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 20:38 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Parent finalize в таком варианте вызывается. Похоже меня обманули с пунктом 4 или я как-то его не так понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 20:44 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
questioner, вы что.думаете что написав runFinalization сборщик мусора начнет анализ всех доступных объектов а потом вызовет у них метод финализатора? финализатор это простой способ защиты от дурака - если пр-ст забыл построить конструкцию closeable , последний довод короля передтем как объект попадет в рай или сдохнет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 21:39 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
Где-то в степиquestioner, вы что.думаете что написав runFinalization сборщик мусора начнет анализ всех доступных объектов а потом вызовет у них метод финализатора? финализатор это простой способ защиты от дурака - если пр-ст забыл построить конструкцию closeable , последний довод короля передтем как объект попадет в рай или сдохнет Ну ок. runFinalization получается говорит, что сделай следующие финализации в новом потоке? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2018, 21:56 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
questioner, Ты работал с JNI ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:20 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
questionerЖду исправлений, добавлений. Причина простая - непредсказуемость. Что бы предсказать, нужно учесть все тонкости работы GC и JVM. Но этого никто не знает (даже среди разработчиков JVM, ибо разные куски пилят). Ну а всякое замедление, это так, для "академической полноты". Любят западные деятели в околопрограммистских кругах казаться "умными", но что такое "умный" в понимании среднего пейсателя на машинном языке? Это как раз перец, способный с умным видом перечислить элементы списка с присвоением им номеров. Ну так их учили, так они привыкли. Поэтому тупо перечисляют всё, что в башку приходит. А выделить главное - ну извините, этому не учили. А так вообще ради страховки на предмет "не могу всё предусмотреть" можно в finalize засовывать дублирование освобождения ресурсов. А можно просто мониторить утечки и находить то, что не предусмотрел. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 13:13 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
maytonТы работал с JNI ? А тебе это зачем? Укажи связь с сабжем. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 13:14 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
совершенно не нужно знать все тонкости, от релиза к релизу убощики меняются, на примере дотнета - начали с дистрофика, а в последних релизах уже полноценный многопоточный шварцнейгер, можно ведь его просто отключить как суть, и рабоать без него самим следить за кучей. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:26 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
В девятке - deprecated. Там же описано на что заменять. Поэтому для собеседования вопрос морально устарел и имеет интерес чисто археологический. Ну а JNI просто в тему управления освобождением ресурсов которые вы подключили как native обёрткой но забыли контролировать явное удаление. Разумеется для старых jdk. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:35 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
questionerПочитал материала на тему С разморозкой . ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 16:48 |
|
Что плохого в finalize?
|
|||
---|---|---|---|
#18+
maytonНу а JNI просто в тему управления освобождением ресурсов которые вы подключили как native обёрткой но забыли контролировать явное удаление. Разумеется для старых jdk. Для JNI есть набор ограничений на нативную сторону. Если набор выполняется, то Java-сторона ведёт себя как привыкла, то есть не думает о ресурсах более, чем обычно. В этом суть специализированного нативного вызова - сделать его обычным для Java. А почему только для старых jdk? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 18:01 |
|
|
start [/forum/topic.php?fid=59&msg=39720564&tid=2121697]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
128ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 384ms |
total: | 614ms |
0 / 0 |