Pergunta

Esta pergunta já tem uma resposta aqui:

Isso é principalmente por curiosidade.

Eu estava vagando se alguém encontrou algum bom uso para objetos.Finalize (), exceto para fins de depuração/log/perfil?

Se você não encontrou o que diria que seria um bom uso?

Foi útil?

Solução

Se o seu objeto Java usar o JNI para instruir o código nativo para alocar a memória nativa, você precisará usar o Finalize para garantir que ele seja liberado.

Outras dicas

Atrasado para a festa aqui, mas pensei que ainda iria entrar em contato:

Um dos melhores usos que encontrei para os finalizadores é chamar métodos explícitos de rescisão que, por qualquer motivo, não foram chamados. Quando isso ocorre, também registramos o problema porque é um bug!

Porque:

  • Não há garantia de que os finalizadores sejam executados prontamente (ou tecnicamente de todo), de acordo com a especificação do idioma
  • A execução depende em grande parte da implementação da JVM
  • A execução às vezes pode ser atrasada se o GC tiver uma prioridade de rosca mais baixa

Isso deixa apenas algumas tarefas que eles podem abordar sem muito risco.

  1. fechar conexões externas (dB, soquete etc)
  2. fechar arquivos abertos. pode até tentar escrever algumas informações adicionais.
  3. exploração madeireira
  4. Se essa classe executar processos externos que devem existir apenas enquanto o objeto existir, você poderá tentar matá -los aqui.

Mas é apenas um fallback que é usado é o mecanismo "normal" não funcionou. O mecanismo normal deve ser iniciado explicitamente.

Libere recursos que devem ser divulgados manualmente em circunstâncias normais, mas não foram lançados por algum motivo. Talvez com escreva um aviso no log.

Eu o uso para escrever dados de volta em um banco de dados ao usar referências soft para objetos apoiados pelo banco de dados em cache.

Eu vejo um bom uso para finalize (): liberar recursos disponíveis em grandes quantidades e não são exclusivos.

Por exemplo, por padrão, existem 1024 alças de arquivo disponíveis para um processo Linux e cerca de 10000 para Windows. Isso é praticamente, para a maioria dos aplicativos, se você abrir um arquivo, não precisa ligar Liberte para você algum tempo depois. No entanto, para algumas partes de código (como aplicativos de servidor intensivo), a liberação de recursos com .close () é obrigatória, caso contrário, finalmente () pode ser chamado de tarde demais para você e você pode ficar sem alças de arquivo.

A mesma técnica é usada pelos recursos do sistema operacional Swing - para exibir Windows e desenho, não são lançados por qualquer método .close (), mas apenas por finalize (), para que você não precise se preocupar com todos .close () ou .Dispose () métodos como no SWT, por exemplo.

No entanto, quando houver um número muito limitado de recursos, ou você deve "bloquear" o recurso para usá -lo, lembre -se também de "desbloqueá -lo". Por exemplo, se você criar um bloqueio de arquivo em um arquivo, lembre -se também de remover esse bloqueio; caso contrário, ninguém mais poderá ler ou escrever este arquivo e isso pode levar a deadlocks - então você não poderá confiar no Finalize () para remover Este bloqueio para você - você deve fazê -lo manualmente no lugar certo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top