Memory Leaks por referência obsoleta.

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:

Stack

A 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.

2 comentários:

Unknown disse...

Caião...
saudades do cê rapaz!!
tah na CPM Braxis entao?? q legal..
acho q o Zeh ea Ki suco foram para ai tb!!

eu sei q devia postar sobre o código...mas como eu nao entendo nada...posto minhas saudades q eh melhor..hahaauaua

abraçao...e continua escrevendo q qq dia eu entendo..prometo!!

Caio Bomfim Martins disse...

Grande Nana!!
Então, esses dias eu encontrei o Zeh aqui!

Abração e saudades tb!!

Ratings:

Avaliação deste artigo

Copyright © Programming @ home