Quais são os tipos de referências em Java e quais são as suas características?
sobes.tech IA
Resposta da IA
Em Java, existem três tipos principais de referências (variáveis de referência), que diferem no comportamento do recolhedor de lixo:
- Referência Forte (Strong Reference)
- Referência Suave (Soft Reference)
- Referência Fraca (Weak Reference)
- Referência Fantasma (Phantom Reference)
Referência Forte (Strong Reference)
Este é o tipo de referência mais comum. Um objeto apontado por uma referência forte não será recolhido pelo recolhedor de lixo enquanto existir pelo menos uma referência forte a ele.
// Criação de um objeto e uma referência forte a ele
Object myObject = new Object();
Referência Suave (Soft Reference)
Uma referência suave aponta para um objeto que pode ser recolhido pelo recolhedor de lixo se a JVM precisar de memória. Os objetos apontados apenas por referências suaves não serão garantidamente recolhidos até que a JVM tenha uma necessidade urgente de libertar memória. Usado frequentemente para cache.
import java.lang.ref.SoftReference;
// Criação de um objeto
Object data = new Object();
// Criação de uma referência suave ao objeto
SoftReference<Object> softRef = new SoftReference<>(data);
// O objeto data pode ser recolhido se a memória faltar
// Se o objeto não tiver sido recolhido, pode ser recuperado
Object retrievedData = softRef.get();
Referência Fraca (Weak Reference)
Uma referência fraca aponta para um objeto que pode ser recolhido pelo recolhedor de lixo a qualquer momento se não houver referências fortes a ele. As referências fracas são frequentemente usadas para implementar caches, onde os elementos podem ser descartados em caso de falta de memória.
import java.lang.ref.WeakReference;
// Criação de um objeto
Object cacheEntry = new Object();
// Criação de uma referência fraca ao objeto
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// O objeto cacheEntry pode ser recolhido a qualquer momento
// Verificação se o objeto foi recolhido
if (weakRef.get() == null) {
// O objeto foi recolhido
}
Referência Fantasma (Phantom Reference)
Uma referência fantasma é usada em conjunto com ReferenceQueue para realizar ações antes de o objeto ser completamente eliminado da memória. Não é possível obter o objeto através de uma referência fantasma (get() sempre devolve null). Usado principalmente para gestão de recursos que requerem limpeza especial.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Criação de um objeto para rastreamento
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Criação de uma referência fantasma e ligação com a fila
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// Num thread separado, pode-se monitorizar a fila referenceQueue
// Quando o objeto resource estiver pronto para ser eliminado, a referência fantasma aparecerá na fila
Características e comparação:
| Tipo de referência | Recolhedor de lixo | Obter objeto com get() |
Uso |
|---|---|---|---|
| Referência Forte | Não recolhe | Sim | Uso comum |
| Referência Suave | Pode recolher | Sim (se não recolhido) | Caching (quando há falta de memória) |
| Referência Fraca | Pode recolher | Sim (se não recolhido) | Caching (se não há referências fortes) |
| Referência Fantasma | Pode recolher | Não (sempre null) | Limpeza de recursos antes de eliminar (com ReferenceQueue) |