Pessoal vendo alguns codigos por ai reparei na seguinte empreitada:
I.
List list = new ArrayList();
Integer num = null;
while (condição){
num = new Integer();
list.add( num );
}
II.
List list = new ArrayList();
while (condição){
Integer num = new Integer();
list.add( num );
}
O primeiro código é mais performático ? pois o segundo código é menos interessante pois estaria criando varias referências desnecessarias no Heap dando mais trabalho ao GC ?
Obrigado, JP
Opa… Não sei dizer ao certo qual código é mais eficiênte… Pode acontecer de códigos escritos de maneira diferente virarem o mesmo Bytecode no fim, isso depende do compilador e eu realmente não entendo muito sobre como o javac trabalha…
O que eu posso te adiantes é que no Head são armazenados os objetos, então os 2 códigos não teram nenhuma diferença em relação ai Head. As variáveis de instância ficam armazenadas no Stack no mesmo lugar onde são armazenados os tipos primitivos.
Não sei se o GC trabalha no Stack também, mas fica essa informação! Sua dúvida é bem interessante vai ser legal ver ela respondida hehehe
Achei esse link http://gcc.gnu.org/java/papers/nosb.html mas não tenho tempo de ler agora, se você descobrir algo posta ai!
Abs
Os dois codigos estão criando exatamente a mesma quantidade de objetos. O fato de a variavel estar declarada dentro ou fora do loop não significa nada. Lembrando que o GC não coleta referencias, ele coleta objetos que não possuem mais referencias, as variaveis “morrem” quando saem do escopo.
É o que eu entendo por gerenciamento de memoria no Java.
É realmente foi infeliz em falar do GC nesse caso, o que me deixa precupado é a declaração [color=red]Integer num = …;[/color] dentro do [color=red]while(n)[/color], vc tem razão o numero de objetos criados será o mesmo, mas o número de referências no caso II. não será da ordem de n ? enquanto no primeiro será de 1;