2015-04-30 3 views
0

Нити Finalizer отвечают за очистку объектов в очереди финализации. По иронии судьбы, тот же самый финализатор может отвечать за OOM?Может ли поток Finalizer вызывать нехватку памяти?

+4

Да. Вы теоретически можете запускать произвольный код в потоке, поэтому он легко может OOM. У вас есть какая-то конкретная проблема? Любой код для обмена? –

+0

У меня нет кода для обмена, но GC отвечает за очистку объектов в куче, но поток финализатора работает независимо, поэтому вам нужно знать способы, как финализатор может привести к OOM. –

+0

. Я попытался сделать метод 'finalize()' что-то завораживающим , но оказывается, что это непростая задача.Любой брошенный OOM будет проглочен потоком GC, и он не разрушит виртуальную машину, любые неудачные распределения просто выбросят ошибку OOM. Это может потребовать некоторого технического обслуживания, которое может привести к его краху. –

ответ

0

Короткий ответ: да.

Некоторые классы реализуют метод Object.finalize(). Объектам, которые переопределяют этот метод, необходимо вызвать фоновым вызовом финализатор, и они не могут быть очищены до тех пор, пока это не произойдет. Если эти задачи короткие, и вы не отбрасываете многие из этих , все работает хорошо. Однако, если вы создаете много этих объектов и/или их финализаторы занимаете много времени, создает очередь завершенных объектов. Эта очередь может использовать всю память.

Если создано много объектов с финализаторами, вероятно, будут проблемы с производительностью, , даже если базовые исходные ресурсы будут явно освобождены с использованием блоков try-finalize.

Код, чтобы попробовать и просмотреть java сборщик мусора с финализаторами, показал следующий результат.

Удивительно легко опередить сборщик мусора Java, если создано множество объектов с финализаторами, , приводящее к ложным ошибкам вне памяти с большим количеством объектов, которые теоретически могут быть исправлены. Более того, это можно найти на ссылка http://www.enyo.de/fw/notes/java-gc-finalizers.html

есть некоторые приложения, которые попали эта очередь финализации создать проблемы в прошлом, так что стоит подумать , как бороться с ним. Один из очевидных способов - увеличить приоритет потока «Finalizer» daemon - для этого нет API, , поэтому вам нужно пропустить все потоки, чтобы найти его по имени, а затем увеличить его приоритет.

Вы также мог бы принять явный контроль над завершением удаления методы финализации() и используя свои явные очереди , используя свои собственные ссылки на объекты в очень похожим образе, что класс Финалайзера обрабатывает объекты и их Finalize() методов , Таким образом, вы контролируете приоритет и расписание потока обработки финализации.

Обратите внимание, что ни один из этих методов не уменьшает накладные расходы при наличии объектов, подлежащих окончательному окончанию, они просто избегают создания очереди из-за потока с более низким приоритетом.

Как завершение работы показан на ссылку ниже для любопытных

http://www.fasterj.com/articles/finalizer2.shtml

+0

@Alex согласился. Но в этом случае ответ «да». Ссылки были предоставлены в качестве дополнительной информации в случае, если он захочет вникать в нее. Вы не хотите, чтобы я вставлял 4 страницы информации здесь! , – Raj

+0

Если «да» недостаточно само по себе (это не так), то ему нужно описание. Ссылки! = Описание. Вы утверждаете, что соглашаетесь, так почему бы не написать описание. (Некоторые отличные ответы на этом сайте намного длиннее 4 страниц!) –

+0

@Alex Я сказал, что согласен с этим понятием, но каждое правило имеет понятие исключения, и его нужно решать на основании ситуации. Почему бы не заняться вопросами домашней работы. потому что мы здесь, чтобы помочь не делать работу для других. В этом случае я просто показал, где «искать дополнительную информацию», и я хочу подчеркнуть «больше информации», как написано в моем ответе. Это зависит от человека, который спросил, хочет ли он посмотреть больше информации или нет. Я не хочу, чтобы stackoverflow был википедией. поэтому иногда я публикую ссылки, которые могут помочь зрителю понять ситуацию больше, если он этого захочет. Больше никаких аргументов. – Raj

1

Короткий ответ: Теоретически Да.

Более конкретно, это зависит от того, как создается поток финализатора и что он делает. В общем, любое создание нового объекта может привести к OOM, если не останется свободной памяти.

+0

Можем ли мы изменить поток финализатора Behavior? Если да, можете ли вы сказать мне, как это сделать? –

Смежные вопросы