Na primeira parte, foram apresentados os tópicos mais básicos da coleta de lixo. Neste segundo artigo, vou me concentrar na coleta de lixo especificamente para a plataforma Java.
É tudo sobre referências
Como foi descrito na primeira parte, apenas a memória ocupada por objetos que não possuem referências pode ser reciclada.
Existem duas categorias de referência:
Referências fortes
Referências fracas
Uma referência forte é aquela que faz referência a um objeto alcançável. Por outro lado, uma referência fraca é uma referência que não garante que o objeto referenciado seja coletado pelo GC. Qualquer objeto referenciado apenas para referências fracas é considerado inacessível.
A API Java define o seguinte modelo de referência fraco: http://download.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html
Portanto, em Java, existem três tipos de referências fracas:
Referências suaves
Referências fracas
Referências fantasmas
A principal diferença entre esses tipos de referência fraca é a maneira como o JVM GC agirá com eles. Portanto, se tivermos uma referência soft, a JVM pode decidir coletar, ou não, essa referência. Nesse caso, a JVM tem bastante memória heap, então, parar o aplicativo para coletar seu lixo pode não ser necessário.
Por outro lado, as referências fracas serão removidas assim que o GC encontrar uma.
Por fim, as referências fantasmas oferecem a oportunidade de reciclar a memória antes que o espaço seja recuperado.
Analisando um coletor de lixo
Existem vários critérios que devem ser analisados para avaliar um coletor de lixo:
Uso de CPU
Maneiras de prever pausas
Requisitos de memória (e interação com sistemas de memória adicionais
, como cache e memória virtual)Impacto local
Existem outros itens a serem considerados, mas provavelmente os listados acima são os mais relevantes.
Como você pode imaginar, o GC é um tópico ENORME. Espero que meus dois artigos tenham motivado o leitor a continuar investigando a respeito.
Se for esse o seu caso, este é um primeiro passo sólido: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.Introduction%7Coutline