Performace de código

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;