2013-08-18 2 views
-1

Методы Finalize вызывают сборщик мусора перед возвратом памяти, занимаемой объектом, которая имеет метод finalize(). Это означает, что вы не знаете, когда объекты будут завершены.Выполнение сборщика мусора Java

Почему мы не знаем, когда будет запущен сборщик мусора. Не знают и основатели Java. Будет определенное условие или время (точно), когда сборщик мусора будет работать.

ответ

0

Когда сборка мусора выполняется до реализации, но это обычно происходит, когда свободная память достигает определенного порога.

Я помню, что слышал, что для реализации не допускается сбор мусора вообще!

Вы не сможете точно сказать, когда будет происходить сбор, не зная деталей реализации, а затем следите за тем, что наблюдает GC. Но даже у этого будут проблемы, и он очень обескуражен, так как полностью побеждает переносимость Java.

является метод System.gc который:

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

Однако использование этого также не рекомендуется.

2

Почему мы не знаем, когда будет запущен сборщик мусора.

Это преднамеренный выбор дизайна. Это дает JVM гибкость в сборе мусора за раз (и в некотором роде), что дает оптимальную производительность или минимальные паузы ... в зависимости от выбранного вами коллекционера.

Когда будет запущен сборщик мусора, будет определенное условие или время.

No.

Единственное, что она в значительной степени гарантирует, что полный GC будет работать до того, как JVM решает «отказаться» и бросить OutOfMemoryError.

Метод System.gc() который вы можете позвонить в , чтобы предложить JVM, что он должен запускать сборку мусора. Однако:

  • JVM разрешено игнорировать это предложение.

  • Если JVM обращает внимание на это предложение, ваше приложение может работать хуже, чем если бы вы разрешили JVM. Вызов System.gc() в производственном коде почти всегда является BAD IDEA.


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

+0

+1 Я бы добавил, что любое исключение, вызванное кодом, запущенным в финализаторе, будет проглочено, и код будет умирать молча, в результате чего трудно найти ошибки. –