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