Compreendendo a coleta de lixo (p2 / 2)

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.

Cenário

É 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