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