Подтвердить что ты не робот

В чем разница между методом System.gc() и finalize() в java?

Я запутался между system.gc() и finalize() методом java. Мы не можем заставить собирать мусорный объект JVM. Мы разрешаем писать оба метода в нашем java-коде, а если оба они используются для сбора мусора, то какова точка в предоставлении двух методов для сбора мусора java?

Расскажите, пожалуйста, о том, какая работа и как работает, и как она работает?

4b9b3361

Ответ 1

System.gc() любезно просит систему выполнить сборку мусора. Джавадок говорит:

Запускает сборщик мусора.

Вы не можете контролировать, как "жесткий" сборщик мусора будет работать. То, как сборщик мусора работает внутри, является специфичным для VM и самостоятельной исследовательской темой. Но, как правило, "полная" сборка мусора и небольшая "инкрементальная" коллекция происходит. Поэтому рассмотрите System.gc как запрос, но там не гарантируется, что сбор мусора вашего объекта произойдет.

Object.finalize() может быть переопределен, чтобы указать, что делать, когда данный объект собирает мусор (фактически, что делать непосредственно перед сбором мусора). Джавадок говорит:

Вызывается сборщиком мусора на объект при сборке мусора определяет, что ссылок на объект больше нет.

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

Не используйте финализатор для выполнения действий при выходе из JVM. Для этого используйте крюк выключения, который вы регистрируете с помощью Runtime.getRuntime().addShutdownHook(Thread).

Ответ 2

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.

Ответ 3

system.gc() метод уведомляет JVM о том, что сборщик мусора может теперь запустить, чтобы очистить память, удалив неиспользуемые объекты. Согласно java-документу:

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

finalize() метод не будет вызывать сборщик мусора, вместо этого он будет вызываться, пока сборщик мусора об уничтожении объекта. Он содержит инструкции по правильному очистке объекта.

Ответ 4

метод system.gc() мусор собирает объекты, созданные новым ключевым словом, тогда как метод finalize() используется, когда мы хотим, чтобы мусор собирал объекты, которые не были созданы с использованием нового ключевого слова. Итак, я думаю, это и. ваш Q

Ответ 5

Сбор мусора используется для восстановления выделенной памяти объекта, а Finalize() вызывается сборщиком мусора перед возвратом метода памяти Finalize(), который в основном используется для выполнения некоторой операции перед удалением объекта

Ответ 6

Существует много классов, которые содержат метод finalize(), я предполагаю, что вы имеете в виду объект в классе Object. System.gc() - это то, что вы вызываете, когда вы хотите, чтобы компилятор мусора Java запускался. Он будет работать сам по себе каждые несколько минут, но вы можете попросить его идти, когда захотите. Когда запускается gargabe collector, он вызывает метод finalize() для каждого объекта, у которого больше нет ссылки. В основном System.gc() очищает память и использует finalize(), чтобы избавиться от отдельных объектов.

Ответ 7

Ответы здесь замечательные, просто нужно разработать небольшую точку в методе finalize(): вы никогда не должны ее использовать. Это выполнение не гарантируется вообще, и в конечном итоге использование finalize() добавляет штраф за производительность.

Как написано в "Эффективной Java" Джошуа Блоха:

Финализаторы непредсказуемы, часто опасны и вообще ненужным. никогда не делайте ничего критически важного в финализаторе. никогда зависят от финализатора для обновления критического состояния.

и

О, и еще одно: для используя финализаторы. На моей машине время для создания и уничтожения простой объект - около 5.6 нс. Добавление финализатора увеличивает время до 2400 нс. Другими словами, это примерно в 430 раз медленнее для создания и уничтожить объекты с финализаторами.

Предпочитаете использовать следующий ресурс, завершающий шаблон try-finally, который гарантированно будет выполняться:

Bar bar = new Bar(...);
try {
    // Your code here
} finally {
    bar.releaseResource(); // You implementation. For example close connection
}

Ответ 8

Сборщик мусора вызывается вызовом метода System.gc() для любого класса. Но это не гарантирует, что все аннулированные объекты будут собираться мусором до того, как jvm отключится. Таким образом, в основном метод gc() - это сбор мусора только для тех объектов, которые создаются с использованием нового ключевого слова. Объекты создаются с помощью любой другой логики, чем это будет мусор, собранный путем явного вызова метода finalize() до того, как gc вызовет сборщик мусора.