В чем разница между System.gc() и finalize() в Java?
Я запутался между system.gc() и finalize() методом Java. Мы не можем принудительно собрать мусорный объект в JVM. Нам разрешено писать оба метода в нашем Java-коде, тогда, если оба они используются для сборки мусора, то какой смысл предоставлять два метода для сборки мусора с помощью Java?
Пожалуйста, скажите мне точную работу обоих методов и внутренне, как это работает?
8 ответов
System.gc()
просит систему выполнить сборку мусора. Javadoc говорит:
Запускает сборщик мусора.
Вы не можете контролировать, насколько "тяжело" будет работать сборщик мусора. Внутренняя работа сборщика мусора зависит от ВМ и является отдельной темой исследования. Но обычно происходит "полная" сборка мусора и небольшая "инкрементная" сборка. Так что посмотрим System.gc
как запрос, но не гарантируется, что сборка мусора вашего объекта произойдет.
Object.finalize()
может быть переопределено, чтобы указать, что делать, когда данный объект собирается сборщиком мусора (фактически, что делать непосредственно перед сборкой мусора). Javadoc говорит:
Вызывается сборщиком мусора на объекте, когда сборщик мусора определяет, что больше нет ссылок на объект.
Классическое использование финализатора состоит в том, чтобы отменить выделение системных ресурсов при сборке мусора, например, файловых дескрипторов выпуска, временных файлов и т. Д.
Не используйте финализатор для выполнения действий при выходе из JVM. Для этого используйте хук отключения, который вы регистрируете Runtime.getRuntime().addShutdownHook(Thread)
,
System.gc()
заставляет сборщик мусора работать, в то время как Finalize()
Метод вашего объекта определяет, что должен делать сборщик мусора при сборе этого конкретного объекта.
Грубо говоря, это так:
class MyClass {
public UnmanagedResource resource;
void Finalize() {
FreeUnmanagedResource(resource);
}
}
MyClass[] data = new MyClass[1000];
for(int i=0; i<1000; i++) {
data[i] = new MyClass();
}
//do some work
data = null;
System.gc(); //Note that it doesn't guarantee you that all MyClass instances will be actually collected at this point.
system.gc()
Метод уведомляет JVM о том, что теперь можно запустить сборщик мусора, чтобы очистить память, удалив неиспользуемые объекты. Согласно документу Java:
Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на утилизацию неиспользуемых объектов, чтобы сделать доступной память, которую они занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить пространство от всех отброшенных объектов.
finalize()
Метод не вызовет сборщик мусора, вместо этого он будет вызван, когда сборщик мусора уничтожит объект. Он содержит инструкции для правильной очистки объекта.
Метод System.gc() собирает объекты, созданные с помощью нового ключевого слова, тогда как метод finalize() используется, когда мы хотим собирать объекты, не созданные с помощью нового ключевого слова. Итак, я думаю, это ответ. ваш Q
Ответы здесь замечательные, просто хотелось бы немного рассказать о методе finalize(): вы никогда не должны его использовать. Его выполнение вообще не гарантируется, и в конечном итоге использование finalize() добавляет снижение производительности.
Как написано в "Эффективной Яве" Джошуа Блоха:
Финализаторы непредсказуемы, часто опасны и, как правило, не нужны. никогда не делайте что-нибудь критичное по времени в финализаторе никогда не зависите от финализатора для обновления критического постоянного состояния.
А также:
Да, и еще одна вещь: существует серьезное снижение производительности за использование финализаторов. На моей машине время создания и уничтожения простого объекта составляет около 5,6 нс. Добавление финализатора увеличивает время до 2400 нс. Другими словами, создание и уничтожение объектов с помощью финализаторов примерно в 430 раз медленнее.
Предпочитайте использовать следующий ресурс, завершающий шаблон try-finally, который гарантированно будет работать:
Bar bar = new Bar(...);
try {
// Your code here
} finally {
bar.releaseResource(); // You implementation. For example close connection
}
Сборщик мусора вызывается путем вызова System.gc()
метод на любой класс. Но это не гарантирует, что все обнуленные объекты будут собраны сборщиком мусора до завершения работы jvm. Так в основном gc()
Метод сбора мусора только тех объектов, которые созданы с использованием нового ключевого слова. Объекты создаются по любой другой логике, кроме как это будет сбор мусора путем явного вызова finalize()
метод перед gc
вызывает сборщик мусора.
Есть много классов, которые содержат метод finalize(), я предполагаю, что вы имеете в виду тот, что в классе Object. System.gc() - это то, что вы вызываете, когда хотите запустить компилятор мусора Java. Он будет запускаться сам по себе каждые несколько минут, но вы можете попросить об этом, когда захотите. Когда сборщик gargabe запускается, он вызывает метод finalize() для каждого объекта, на который больше нет ссылок. По сути, System.gc() очищает память и использует finalize(), чтобы избавиться от отдельных объектов.
Сборка мусора используется для восстановления выделенной памяти объекта и Finalize()
вызывается сборщиком мусора перед восстановлением памяти Finalize()
Метод в основном используется для выполнения какой-либо операции перед удалением объекта