Duvida sobre artigo "Vazamento de memoria com java?"

Desculpem me, sei que nao é aq que eu deveria postar mas é que nao achei o topico no forum de artigos.

01     public class StackSimplerrima {
02 
03     protected int topo = 0;
04     protected Object[] array = new Object[100]; // lindo! :)
05 
06     public Object push(Object o) {
07         array[topo++] = o;
08     }
09 
10     public Object pop() {
11         return array[topo--];
12     }
13 
14 }

no artigo o Paulo disse que se vc empilhar 100 objetos e depois desempilhar eles todos e denovo empilhar outros 100 o garbage collector nao limpara da memoria os primeiros 100, mas o garbage collector nao limpa da memoria os objetos que nao tenham nenhuma referencia, e assim sendo quando vc empilhar 100 objetos pela segunda vez, vc na verdade nao esta deixando os primeiros 100 sem referencia??? Se entendi direito. Assim, deixando os primeiros 100 sem referencia o garbage limpará sim os primeiros 100!!!

Não sei se fui claro, alguem ai me ajude a esclarecer minha mente!
Paulo estou ancioso pelos proximos artigos sobre Garbage Collector.
Desde já agradeço.

nao li o artigo, mas provavelmente eh algo assim:
se vc empilhar 100 coisas e depois desempilhar, o gc nao vai coletar as primeiras… isso pq o seu array ainda faz referencia àqueles objetos, o que os torna inelegíveis para gc…

Para evitar esse problema de ter objetos não-coletados, a correção é simples. (Exercício: por que é que isso possibilita a tal coleta de lixo?)

 01     public class StackSimplerrima {
 02 
 03     protected int topo = 0;
 04     protected Object[] array = new Object[100]; // lindo! :)
 05 
 06     public Object push(Object o) {
 07         array[topo++] = o;
 08     }
 09 
 10     public Object pop() {
 10a       topo--;
 10b       Object ret = array[topo];
 10c       array[topo] = null;
 11         return ret;
 12     }
 13 
 14 }

Essa correção no código eu entendi.

Mas tbm se eu depois de desempílhar os 100 e tornasse a em pilhar outros objetos (ou seja, sobre-escrever a referencia nos 100 antigos) os objetos antigos perderiam suas referencias e seriam coletados pelo Garbage Collector???

Ou eu sou obrigado a colocar:

array[topo] = null;

Desde ja agradeço.

Só de você setar a referência para null (que é o que fiz no “pop”), se não houver mais nenhuma referência para o tal objeto, ele fica disponível para “garbage collection”.

Dica: quando você precisa ver esse tipo de coisas, é preciso desenhar um monte de diagramas com flechinhas. Um objeto é algo para onde as flechinhas apontam, e uma variável (ou elemento no array) é algo de onde pode sair uma flechinha. Se nenhuma flechinha apontar mais para o objeto, então ele está disponível para “garbage collection”. É por isso que nesse caso eu setei o tal “array[topo] = null”.

Blz galera, entendi o esquema.
Valew daq apouco venho com mais duvidas hehehhehehe.
Obrigado por enquanto!

Acho que entendi o que o maruero quer dizer… deixe-me ver se entendi também…

Levando em conta que todos os objetos da pilha só tenham uma referência, quer dizer que

     public Object trocarODoTopo(Object o) {
        Object ret = array[topo];
        array[topo] = o;
        return ret;
     }

Não deixa o objeto disponível pro gc, e teria que fazer assim pra deixar:

     public Object trocarODoTopo(Object o) {
        Object ret = array[topo];
        array[topo] = null;
        array[topo] = o;
        return ret;
     }

Isso não faz sentido algum pra mim também…

[quote=dudaskank]Acho que entendi o que o maruero quer dizer… deixe-me ver se entendi também…

Levando em conta que todos os objetos da pilha só tenham uma referência, quer dizer que

     public Object trocarODoTopo(Object o) {
        Object ret = array[topo];
        array[topo] = o;
        return ret;
     }

Não deixa o objeto disponível pro gc, e teria que fazer assim pra deixar:

     public Object trocarODoTopo(Object o) {
        Object ret = array[topo];
        array[topo] = null;
        array[topo] = o;
        return ret;
     }

Isso não faz sentido algum pra mim também…[/quote]

mais ou menos… a segunda maneira eh meio redundante, ou seja, vc nao precisa setar a referencia para null explicitamente, pois quando vc coloca outro objeto no lugar, a referencia antiga jah eh sobrescrita…