Bom!!! estou eu na minha segunda leitura pelo livro escrito pelo pessoal da Caelum,
No segundo capítulo onde são comentados detalhes do funcionamento da Java Virtual Machine.
A minha dúvida eh, na pagina 25 onde ele comenta sobre o algoritmo de GC chamado Generational Copying e
ainda demonstra o seguinte algorimo:
for(int i = 0; i < 100; i++){
List<Object> lista = new ArrayList<Object>();
for(int j = 0; j < 300000; j++){
lista.add(new Object());
}
}
Ao executar o código com a opção -verbose:gc habilitada ao ser impresso no console
as atividade do GC o minor GC se mostra pouco eficiênte liberando pouco espaço da memória.
E logo na página 26 o autor do capitulo diz que o trecho de código foi construido para segurar referêcias
por um tempo à mais afim de estressar o GC.
A dúvida é como otimizar este trecho de código afim de não estressar tanto o GC e fazer com que o minor GC trabalhe de forma coerente afim de não ser preciso chamar o Full GC.
Cara, pelo o que li do código, você não terá objetos liberados para a coleta até o término do primeiro laço, pois todos os objetos criados no segundo laço estão no mesmo escopo da “lista” ao qual eles foram incluídos, portanto, o GC estará “estressado” como você disse. Mas veja o que ocorre quando fizer a seguinte alteração.
for(int i = 0; i < 100; i++){
List<Object> lista = new ArrayList<Object>();
for(int j = 0; j < 300000; j++){
lista.add(new Object());
lista.clear();
}
}
Com essa alteração os objetos criados não contém referência alguma e assim serão marcados para a coleta.
Vini Fernandes da forma que vc colocou agora… eu irei descartar os objetos que estão lista da interação passada…
Ou seja os objetos que foram adicionados na interação 1, logo serão excluidos na intereção 2 e assim por diante.
Mais se eu quiser manter eles em memória!! como o exemplo que esta no livro?
Mas o código original do livro já mantém os objetos em memória, porém, eles estarão no mesmo escopo da lista criada no primeiro laço. Mas se você quer investigar o comportamento do GC tente o seguinte:
for(int i = 0; i < 100; i++){
List<Object> lista = new ArrayList<Object>();
for(int j = 0; j < 300000; j++){
lista.add(new Object());
}
Thread.spleep(3000);//aqui voce tera 300000 objetos em memoria (paradinhos mesmo...rsrs) e vc podera ler o console
//quando o laco for executado novamente sera criada uma nova lista e todos os 300000 objetos contidos na lista antiga serao marcados para coleta
}