logo

Destruidor Java

Em Java, quando criamos um objeto da classe ele ocupa algum espaço na memória (heap). Se não excluirmos esses objetos, eles permanecem na memória e ocupam um espaço desnecessário que não é adequado do ponto de vista da programação. Para resolver esse problema, usamos o destruidor . Nesta seção, discutiremos a opção alternativa para o destruidor em Java . Além disso, também aprenderemos como usar o finalizar() método como um destruidor.

O destruidor é o oposto do construtor. O construtor é usado para inicializar objetos enquanto o destruidor é usado para excluir ou destruir o objeto que libera o recurso ocupado pelo objeto.

Lembre-se disso não há conceito de destruidor em Java . No lugar do destruidor, Java fornece o coletor de lixo que funciona da mesma forma que o destruidor. O coletor de lixo é um programa (thread) executado no JVM . Ele exclui automaticamente os objetos não utilizados (objetos que não são mais usados) e libera memória. O programador não precisa gerenciar a memória manualmente. Pode ser propenso a erros, vulnerável e causar vazamento de memória.

Qual é o destruidor em Java?

É um método especial que é chamado automaticamente quando um objeto não é mais usado. Quando um objeto completa seu ciclo de vida, o coletor de lixo exclui esse objeto e desaloca ou libera a memória ocupada pelo objeto.

Também é conhecido como finalizadores que não são determinísticos. Em Java , a alocação e desalocação de objetos manipulados pelo coletor de lixo . A invocação de finalizadores não é garantida porque invoca implicitamente.

Vantagens do Destruidor

  • Libera os recursos ocupados pelo objeto.
  • Nenhuma chamada explícita é necessária, ela é invocada automaticamente no final da execução do programa.
  • Não aceita nenhum parâmetro e não pode ser sobrecarregado.

Como funciona o destruidor?

Quando o objeto é criado ele ocupa o espaço no heap. Esses objetos são usados ​​pelos threads. Se os objetos não forem mais usados ​​pelo thread, ele se tornará elegível para a coleta de lixo. A memória ocupada por esse objeto agora está disponível para novos objetos que estão sendo criados. Observa-se que quando o coletor de lixo destrói o objeto, o JRE chama o método finalize() para fechar conexões como banco de dados e conexão de rede.

Do exposto, podemos concluir que o uso do destruidor e do coletor de lixo é o nível de interferência do desenvolvedor no gerenciamento de memória. É a principal diferença entre os dois. O destruidor notifica exatamente quando o objeto será destruído. Enquanto em Java, o coletor de lixo faz o mesmo trabalho automaticamente. Estas duas abordagens à gestão da memória têm efeitos positivos e negativos. Mas o principal problema é que às vezes o desenvolvedor precisa de acesso imediato ao gerenciamento de memória.

Método Java finalize()

É difícil para o programador executar o coletor de lixo à força para destruir o objeto. Mas Java oferece uma maneira alternativa de fazer o mesmo. A classe Java Object fornece o finalizar() método que funciona da mesma forma que o destruidor. A sintaxe do método finalize() é a seguinte:

Sintaxe:

 protected void finalize throws Throwable() { //resources to be close } 

Não é um destruidor, mas fornece segurança extra. Garante o uso de recursos externos como fechar o arquivo, etc. antes de encerrar o programa. Podemos chamá-lo usando o próprio método ou invocando o método System.runFinalizersOnExit (verdadeiro) .

  • É um método protegido da classe Object definido no pacote java.lang.
  • Ele pode ser chamado apenas uma vez.
  • Precisamos chamar o método finalize() explicitamente se quisermos substituir o método.
  • O gc() é um método de JVM executado pelo Garbage Collector. Ele é invocado quando a memória heap está cheia e requer mais memória para novos objetos que chegam.
  • Exceto pelas exceções não verificadas, a JVM ignora todas as exceções que ocorrem pelo método finalize().

Exemplo de destruidor

DestrutorExample.java

 public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } } 

Saída:

 Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector