5.2 KiB
5.2 KiB
title | localeTitle |
---|---|
Garbage Collection | Coleta de lixo |
Coleta de lixo em Java
Em linguagens como C / C ++, é dever do programador criar e destruir objetos. Mas se o programador não executa seu dever, memória suficiente pode não estar disponível para a criação de um novo objeto e o programa pode terminar causando OutOfMemoryErrors .
Java alivia o programador da tarefa de gerenciamento de memória e recupera a memória ocupada pelos objetos que não estão mais em uso. Coleta de lixo em java é realizada por um thread daemon chamado Garbage Collector . JVM (Java Virtual Machine) invoca quando há falta de memória (heap) para novos objetos.
Quando um objeto se torna elegível para o Garbage Collection?
- Um objeto se torna elegível para a Coleta de lixo se não puder ser acessado de nenhum encadeamento ao vivo ou de qualquer referência estática.
- Um objeto se torna elegível para o Garbage Collection se todas as referências forem nulas.
Integer n = new Integer();
n = null; //the Integer object is no longer accessible
- As dependências cíclicas não são contadas como referência, portanto, se o Objeto X tiver referência ao Objeto Y e o Objeto Y tiver referência ao Objeto X e não tiverem outra referência ao vivo, os Objetos X e Y serão elegíveis para a Coleta de Lixo.
Como tornar manualmente um objeto elegível para coleta de lixo?
- Mesmo que não seja tarefa do programador destruir os objetos, é uma boa prática de programação tornar um objeto inacessível (portanto, elegível para GC) depois de ser usado.
- Geralmente, existem quatro maneiras diferentes de tornar um objeto elegível para coleta de lixo.
- Anulando a variável de referência
- Reatribuindo a variável de referência
- O objeto é criado dentro de um bloco e a referência sai do escopo depois que o controle sai desse bloco.
- Ilha do isolamento
Maneiras de solicitar a JVM para executar o Garbage Collector 1
- Apesar de tornar um objeto elegível para o Garbage Collection, depende da discrição exclusiva do JVM executar o Garbage Collector para destruí-lo.
- Também podemos solicitar que a JVM execute o Garbage Collector. Existem duas maneiras de fazer isso:
- Usando o método System.gc () : A classe System contém o método estático gc () para solicitar que a JVM execute o Garbage Collector.
- Usando o método Runtime.getRuntime (). Gc () : A classe de tempo de execução permite que o aplicativo faça interface com a JVM na qual o aplicativo está em execução. Portanto, usando seu método gc (), podemos solicitar que a JVM execute o Garbage Collector.
// Java program to request
// JVM to run Garbage Collector
public class Test
{
public static void main(String[] args) throws InterruptedException
{
Test test1 = new Test();
Test test2 = new Test();
// Nullifying the reference variable
test1 = null;
// requesting JVM for running Garbage Collector
System.gc();
// Nullifying the reference variable
test2 = null;
// requesting JVM for running Garbage Collector
Runtime.getRuntime().gc();
}
@Override
// finalize method is a method which is called on object once
// before garbage collector is destroying it and reclaiming its memory
protected void finalize() throws Throwable
{
System.out.println("Garbage collector is called");
System.out.println("Object garbage collected : " + this);
}
}
OUTPUT -
Garbage collector called
Object garbage collected : Test@46d08f12
Garbage collector called
Object garbage collected : Test@481779b8
Nota :
- Não há garantia de que qualquer um dos dois métodos acima irá executar o Garbage Collector.
- A chamada System.gc () é efetivamente equivalente à chamada: Runtime.getRuntime (). Gc ()
Finalização de Objetos
- Objetos possuem recursos associados a eles. É sua responsabilidade liberar os recursos.
- O finalize (), é declarado na classe Object e é chamado pelo garbage collector uma vez, antes de destruir o objeto. Um objeto pode executar qualquer última ação usando este método jst antes que sua área seja recuperada pelo coletor de lixo.
- O método finalize () está presente na classe Object com o seguinte protótipo.
protected void finalize() throws Throwable
NOTA 1 :
- O método finalize () chamado pelo Garbage Collector não é a JVM. Embora Garbage Collector seja um dos módulos da JVM.
- O método finalize () da classe Object tem uma implementação vazia, portanto, é recomendado substituir o método finalize () para descartar recursos do sistema ou executar outra limpeza.
- O método finalize () nunca é invocado mais de uma vez para qualquer objeto dado.
- Se uma exceção não identificada for lançada pelo método finalize (), a exceção será ignorada e a finalização desse objeto será finalizada.
FONTES
- geeksforgeeks. Acesso em: 24 de outubro de 2017.