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] -------------------------------------------------------------------------