Memmory leak

Abaixo esta um trecho explicando que ainda posso ter vazamento de memória no java, mesmo com o garbage collector, mas eu nao entendi o exemplo dele, de como abandonando o valor retornado ele nao pode ser eleito para ser limpado pelo garbage collector.

The nature of automatic garbage collection has an important consequence: you can still get memory leaks. If you allow live, accessible references to unneeded objects to persist in your programs, then those objects cannot be garbage collected. Therefore, it may be a good idea to explicitly assign null into a variable when you have finished with it. This issue is particularly noticeable if you are implementing a collection of some kind.
In this example, assume the array storage is being used to maintain the storage of a stack. This pop() method is inappropriate:

  1. public Object pop() {
  2. return storage[index–];
  3. }
    If the caller of this pop() method abandons the popped value, it will not be eligible for garbage collection until the array element containing a reference to it is overwritten. This might take a long time. You can speed up the process like this:
  4. public Object pop() {
  5. Object returnValue = storage[index];
  6. storage[index–] = null;
  7. return returnValue;
  8. }

pequeno trecho retirado do livro SCJP & SCJD - Complete Java 2 Certification Study Guide

O array ainda está fazendo referencia ao elemente retornado por pop.

Se antes de retornar a função pop fizesse um storage[index] = null aí tudo bem… E é o que o segundo exemplo que ele postou faz…

ObjectOutputStream é um caso clássico em Java (que pouca gente sabe) que leaka objeto pra caramba… Quando vc trabalha com ele em cima de um socket, todo objeto passado ali vai para um cache, sem vc saber disso, ou seja, o GC não limpa ele até que vc chame reset().

obrigado, dúvida esclarecida :smiley: