Esse post tem como fonte original o livro "Effective Java" - second edition de Joshua Bloch.
Quando entramos no mundo do Java temos a sensação que não devemos nos preocupar com o recolhimento de memória, pois, existe o
Garbage Collector. Contudo, isso não é bem verdade. Veja o código do link abaixo:
StackA classe stack é muito conhecida pelos programadores e pergunto, você seria capaz de identificar um
memory leak (vazamento de memória)?
Quando damos um
pop na pilha ele decrementa o size do
array dando a impressão de que o objeto foi removido. Contudo, ele ainda está lá e nem é elegível ao Garbage Collector. Apesar do size truncar o tamanho da pilha o objeto ainda existe na memória. Se você fizer size++; ele ainda estará lá e você conseguirá acessa-lo.
Então, para remover essa referência obsoleta faça:
public Object pop() {
if (size == 0) {
throw new EmptySizeException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
Vale lembrar que isso não garante o recolhimento do objeto, veja o código abaixo:
Stack st;
...
Object ob = st.pop();
...
Apesar, da pilha destruir a referência ao objeto que é retornado do método
pop, uma nova referência é criada para ele. Contudo, ainda vale apena aterrar a referência dentro do array.