Boa pergunta, as classes do pacote java.lang.ref suportam um limitado grau de 
interação com o Garbage Collector (GC), e influencia no ciclo de vida do objeto.

        Não existe um objeto com nome StrongReference, isso é apenas para entender, 
uma 
referência forte é algo como:

String s = "SouJava";

        Uma SoftReference é uma referência em que quando o GC precisa liberar memória, 
ele 
procura todas as SoftReferências e remove da memória.

SoftReference soft = new SoftReference(s);
s = null
s = soft.get();
// retorna != null

        Uma WeakReference, é bastante semelhante ao SoftReference, com a diferença 
básica que 
a Soft usa algoritmos para saber se pode ser desalocados objetos da memória, e o Weak 
não usa.

WeakReference soft = new WeakReference(s);
s = null
s = soft.get();
// retorna != null      

        A PhantomReference (ainda não usei), mas é um mencanismo de referência mais 
fraco.

        Aqui vai um pequeno programa de exemplo, execute-o com:

# java -Xmx6m TestReferences

        E troque alternadamente o Soft por Weak e veja a diferença

//-----------------------------------------------------------------
import java.lang.ref.*;
import java.util.*;

public class TestReferences {
        
        public static void main(String[] args) {
                
                printInfoMemory();
                System.out.println("-- before creating 1MB object");
                OneMegaByte oneMB = new OneMegaByte();
                
                //SoftReference soft = new SoftReference(oneMB);
                WeakReference soft = new WeakReference(oneMB);
                
                System.out.println("-- after creating 1MB object" + soft.get());
                printInfoMemory();
                System.out.println("-- consuming memory");
                
                int INTERACTIONS = 100;
                List l = new ArrayList(INTERACTIONS);
                oneMB = null;
                
                for (int i = 0; i < INTERACTIONS; i++) {
                        l.add(new OneMegaByte());
                        printInfoMemory();
                        
                        Object o = soft.get();
                        if (o != null) {
                                System.out.println(">>>>>>>>  oneMB is still alive!!! 
" + o);
                        } else {
                                System.out.println("<<<<<<<<  oneMB was garbaged !!! 
");
                        }
                }
                
                
        }
        
        static int count;
        
        static void printInfoMemory() {
                System.out.println("#######   " + (count++));
                System.out.println("### TOTAL MEMORY = " + 
Runtime.getRuntime().totalMemory());
                System.out.println("### FREE MEMORY = " + 
Runtime.getRuntime().freeMemory());
        }
        
}

class OneMegaByte {
        
        static int instanceCount = 1;
        
        int id;
        
        byte[] ONE_MB = new byte[1024 * 512];
        
        OneMegaByte() {
                id = instanceCount++;
                for (int i = 0; i < ONE_MB.length; i++) {
                        ONE_MB[i] = (byte) i;
                }
        }
        
        public String toString() {
                return "One MegaByte\'s Object [" + id + "]";
        }
        
}
//-----------------------------------------------------------------

[]s

Claudio Miranda


bmaguiar wrote:
> Pessoal, alguém sabe qual é a diferença entre:
> 
>  - StrongReference
>  - SoftReference
>  - WeakReference
>  - PhantomReference
> 
> Não consegui entender até agora!!!
> 
> Um abraço à todos.



------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a