Pergunta

Se eu chamar finalize() em um objeto de meu código de programa, será que o JVM ainda executar o método novamente quando o coletor de lixo processos este objeto?

Esta seria uma aproximado exemplo:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

Seria a chamada explícita para finalize() fazer o JVM's coletor de lixo, para não correr o finalize() método no objeto m?

Foi útil?

Solução

De acordo com este programa de teste simples, a JVM vai ainda fazer a sua chamada para finalizar() mesmo se você explicitamente o chamou:

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");
}

A saída é:

início
finalizando!
finalizando!
feito

Todos os recursos lá fora diz para nunca chamar finalize() explicitamente, e quase nunca se ainda implementar o método, pois não há garantias de como se e quando ele vai ser chamado.Você é melhor fora de fechamento de todos os seus recursos manualmente.

Outras dicas

Deve-se entender que o Coletor de Lixo(GC) de Fluxo de trabalho para compreender a função de finalizar.chamando .finalize() não invocar o coletor de lixo, nem o sistema de chamada.gc.Na verdade, o Que finalizar vai ajudar o programador é declarar a referência de objeto como "não referenciados".

GC forças de uma suspensão sobre a operação da JVM, o que cria um efeito sobre o desempenho.Durante a operação, o GC vai atravessar todos os objetos referenciados, a partir da raiz(objeto de seu principal chamada de método).Essa suspensão do tempo pode ser diminuído através de declarar objetos como não referenciados manualmente, pois irá reduzir os custos de operação para declarar a referência de objeto obsoleto pela execução automatizado.Declarando finalize(), programador define a referência para o objeto obsoleto, assim, na próxima execução do GC operação, GC executar vai varrer os objetos sem o uso de tempo de operação.

Citação:"Depois de finalizar o método foi chamado para um objeto, nenhuma outra ação é executada até que a máquina virtual de Java tem outra vez determinado que não há mais qualquer meio pelo qual este objeto pode ser acessado por qualquer thread que ainda não morreram, incluindo ações possíveis por outros objetos ou classes que estão prontos para ser finalizado, no ponto em que o objeto pode ser descartado."a partir do Java API Doc em java.Objecto.finalize();

Para uma explicação detalhada, você também pode verificar: javabook.computerware

O método finalize nunca é chamado mais de uma vez por uma JVM para qualquer determinado objeto.Você não deve depender de finalizar qualquer maneira, porque não há nenhuma garantia de que ele será chamado.Se o que você está chamando finalizar, porque você precisa para executar limpar o código, em seguida, melhor colocá-lo em um método separado e torná-lo explícito, e.g:

public void cleanUp() {
  .
  .
  .
}

myInstance.cleanUp();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top