Re: [java-list] SoftReference,WeakReference ...

2002-07-12 Thread Claudio Miranda


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




[java-list] SoftReference,WeakReference ...

2002-07-10 Thread bmaguiar

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