Нити Finalizer отвечают за очистку объектов в очереди финализации. По иронии судьбы, тот же самый финализатор может отвечать за OOM?Может ли поток Finalizer вызывать нехватку памяти?
ответ
Короткий ответ: да.
Некоторые классы реализуют метод Object.finalize(). Объектам, которые переопределяют этот метод, необходимо вызвать фоновым вызовом финализатор, и они не могут быть очищены до тех пор, пока это не произойдет. Если эти задачи короткие, и вы не отбрасываете многие из этих , все работает хорошо. Однако, если вы создаете много этих объектов и/или их финализаторы занимаете много времени, создает очередь завершенных объектов. Эта очередь может использовать всю память.
Если создано много объектов с финализаторами, вероятно, будут проблемы с производительностью, , даже если базовые исходные ресурсы будут явно освобождены с использованием блоков try-finalize.
Код, чтобы попробовать и просмотреть java сборщик мусора с финализаторами, показал следующий результат.
Удивительно легко опередить сборщик мусора Java, если создано множество объектов с финализаторами, , приводящее к ложным ошибкам вне памяти с большим количеством объектов, которые теоретически могут быть исправлены. Более того, это можно найти на ссылка http://www.enyo.de/fw/notes/java-gc-finalizers.html
есть некоторые приложения, которые попали эта очередь финализации создать проблемы в прошлом, так что стоит подумать , как бороться с ним. Один из очевидных способов - увеличить приоритет потока «Finalizer» daemon - для этого нет API, , поэтому вам нужно пропустить все потоки, чтобы найти его по имени, а затем увеличить его приоритет.
Вы также мог бы принять явный контроль над завершением удаления методы финализации() и используя свои явные очереди , используя свои собственные ссылки на объекты в очень похожим образе, что класс Финалайзера обрабатывает объекты и их Finalize() методов , Таким образом, вы контролируете приоритет и расписание потока обработки финализации.
Обратите внимание, что ни один из этих методов не уменьшает накладные расходы при наличии объектов, подлежащих окончательному окончанию, они просто избегают создания очереди из-за потока с более низким приоритетом.
Как завершение работы показан на ссылку ниже для любопытных
@Alex согласился. Но в этом случае ответ «да». Ссылки были предоставлены в качестве дополнительной информации в случае, если он захочет вникать в нее. Вы не хотите, чтобы я вставлял 4 страницы информации здесь! , – Raj
Если «да» недостаточно само по себе (это не так), то ему нужно описание. Ссылки! = Описание. Вы утверждаете, что соглашаетесь, так почему бы не написать описание. (Некоторые отличные ответы на этом сайте намного длиннее 4 страниц!) –
@Alex Я сказал, что согласен с этим понятием, но каждое правило имеет понятие исключения, и его нужно решать на основании ситуации. Почему бы не заняться вопросами домашней работы. потому что мы здесь, чтобы помочь не делать работу для других. В этом случае я просто показал, где «искать дополнительную информацию», и я хочу подчеркнуть «больше информации», как написано в моем ответе. Это зависит от человека, который спросил, хочет ли он посмотреть больше информации или нет. Я не хочу, чтобы stackoverflow был википедией. поэтому иногда я публикую ссылки, которые могут помочь зрителю понять ситуацию больше, если он этого захочет. Больше никаких аргументов. – Raj
Короткий ответ: Теоретически Да.
Более конкретно, это зависит от того, как создается поток финализатора и что он делает. В общем, любое создание нового объекта может привести к OOM, если не останется свободной памяти.
Можем ли мы изменить поток финализатора Behavior? Если да, можете ли вы сказать мне, как это сделать? –
- 1. SqlAlchemy session.add() может вызвать нехватку памяти?
- 2. Есть ли способ предотвратить нехватку памяти numpy.linalg.svd?
- 3. Может ли Finalizer использовать член строки?
- 4. Может ли следующая структура вызывать утечку памяти
- 5. Поворот телефона вызывает нехватку памяти
- 6. Виртуальный размер, вызывающий у программы нехватку памяти
- 7. Как отлаживать нехватку памяти на Windows Phone
- 8. Сочные пиксели жалуются на нехватку памяти
- 9. Разбор CSV, вызывающий нехватку памяти в php
- 10. Как вы имитируете нехватку памяти в MySQL?
- 11. Изменение размера окна вызывает нехватку памяти datagridcellitemautomationpeer
- 12. Добавление изображений в ListView показывает нехватку памяти
- 13. Может ли java 8 lambdas вызывать утечки памяти?
- 14. Может ли ссылка элемента в директиве AngularJS вызывать утечку памяти?
- 15. Может ли локальная переменная вызывать утечку памяти с помощью ARC?
- 16. Может ли небезопасный код на C# вызывать повреждение памяти?
- 17. Можно ли вызывать независимый поток из Servlets?
- 18. Можно ли вызывать на ожидающий поток?
- 19. Можно ли вызывать стопку из памяти?
- 20. Может ли Elasticsearch поток SearchResponse?
- 21. Может ли блокирование по-прежнему вызывать голодание?
- 22. Могут ли делегаты вызывать утечки памяти?
- 23. Будет ли эта программа вызывать утечку памяти?
- 24. Рекурсивно вызывать поток Мула
- 25. Может ли программа вызывать себя?
- 26. Может ли SerialPort.Close вызывать исключение?
- 27. C# - Может ли таймер вызывать событие меню?
- 28. Нужно ли вызывать ObjectOutputStream # close()?
- 29. Будет ли QProcess :: startDetached() вызывать утечку памяти?
- 30. Будет ли эта страница вызывать утечку памяти?
Да. Вы теоретически можете запускать произвольный код в потоке, поэтому он легко может OOM. У вас есть какая-то конкретная проблема? Любой код для обмена? –
У меня нет кода для обмена, но GC отвечает за очистку объектов в куче, но поток финализатора работает независимо, поэтому вам нужно знать способы, как финализатор может привести к OOM. –
. Я попытался сделать метод 'finalize()' что-то завораживающим , но оказывается, что это непростая задача.Любой брошенный OOM будет проглочен потоком GC, и он не разрушит виртуальную машину, любые неудачные распределения просто выбросят ошибку OOM. Это может потребовать некоторого технического обслуживания, которое может привести к его краху. –