Java и вручную, исполняющий завершить

голоса
16

Если я вызываю finalize()на объект из моего программного кода, будет JVM еще запустить метод еще раз , когда сборщик мусора обрабатывает этот объект?

Это было бы приблизительный пример:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

Будет ли явный вызов finalize()сделать JVM «s сборщик мусора не запустить finalize()метод на объекте m?

Задан 26/08/2008 в 19:51
источник пользователем
На других языках...                            


3 ответов

голоса
30

По этой простой тестовой программе, виртуальная машина будет еще сделать его призыв завершить (), даже если вы явно назвать его:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

Выход:

начать
завершение!
финализации!
сделанный

Каждый ресурс там говорит, никогда не называет завершение () в явном виде, и в значительной степени даже не реализовать метод, потому что нет никаких гарантий относительно того, если и когда она будет называться. Ты лучше просто закрыть все ресурсы вручную.

Ответил 26/08/2008 d 20:23
источник пользователем

голоса
6

Нужно понимать сборщика мусора (GC) Workflow понять функцию финализации. вызова .finalize () не будет вызывать сборщик мусора, ни вызова System.gc. На самом деле, Что поможет завершить Кодер объявить ссылку объекта как «без ссылок».

ГХ заставляет подвеску на бегущую работе виртуальной машины Java, которая создает вмятину на производительности. Во время работы GC будет проходить все связанные объекты, начиная с корневого объекта (ваш главный вызов метода). На этот раз суспензии может быть уменьшен путем объявления объектов как вручную, без ссылок, так как он будет сократить затраты на эксплуатацию, чтобы объявить ссылку на объект устаревшей автоматизированной перспективы. Объявив завершить (), кодер устанавливает ссылку на объект устаревшего, таким образом, на следующем запуске операции ОЙ, АЯ перспектива будет подметать объекты без использования времени работы.

Цитата: «После того, как метод финализации был вызван для объекта, никаких дальнейших действий не предпринимается, пока виртуальная машина Java вновь не определено, что нет больше никаких средств, с помощью которого этот объект может быть доступ к любым потоком, который еще не умер, в том числе возможных действий других объектов или классов, которые готовы быть завершены, после чего объект может быть выброшенных "из Java API Doc на java.Object.finalize ().

Для подробного объяснения, вы можете также проверить: javabook.computerware

Ответил 20/12/2013 d 16:22
источник пользователем

голоса
1

Метод финализации никогда не вызывается более чем один раз в JVM для любого заданного объекта. Вы не должны полагаться на финализации в любом случае, потому что нет никакой гарантии, что он будет вызван. Если вы звоните завершить, потому что нужно выполнить очистку кода, то лучше поместить его в отдельный метод и сделать его явным, например:

public void cleanUp() {
  .
  .
  .
}

myInstance.cleanUp();
Ответил 26/08/2008 d 19:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more