Conhecer os conceitos de referências fracas e suaves é diferente de como usá -las. Todos sabemos que o coletor de lixo recupera a memória de objetos que atendem aos critérios de reciclagem, mas nem todos os programadores sabem que os critérios de reciclagem dependem do tipo de referência apontando para o objeto. Essa é a principal diferença entre referências fracas e referências suaves em Java. Se um objeto tiver apenas uma referência fraca apontando para ele, o coletor de lixo recicla o objeto imediatamente, que é uma maneira urgente de reciclá -lo. Relativamente, se houver referências suaves apontando para esses objetos, elas serão recicladas apenas se a JVM exigir memória. O comportamento especial de citações fracas e suaves os torna muito úteis em alguns casos. Por exemplo: referências suaves podem ser usadas bem para implementar o cache. Referências fracas são muito adequadas para armazenar metadados, como armazenar referências de carregador de classe. Se nenhuma classe for carregada, também não há referência ao Classloader. Depois que a última referência forte for removida, apenas o carregador de classe de referência fraco será reciclado. Neste artigo, falaremos sobre diferentes tipos de referências de Java, como: forte referência e fantasma.
Referências fracas vs. referências suaves em Java
Existem quatro tipos de referências em Java:
1. Referência forte
2. Referência fraca
3. Softreference
4. Phantomreference
Referências fortes são as referências mais simples que usamos na programação, como as variáveis s na string code s = "abc" é uma forte referência ao objeto String "ABC". Qualquer objeto apontado por uma forte referência não pode ser reciclado pelo coletor de lixo, e esses objetos são necessários no programa. Referências fracas são representadas pela classe de classe Java.lang.ref.weakreference e você pode criar referências fracas usando o seguinte código:
A cópia do código é a seguinte:
Contador = novo contador ();
FrawReference <Count> fracoCounter = new frAchere Reference <Count> (contador);
contador = nulo;
Agora, desde que você atribua valor nulo ao contador do forte objeto de referência, o objeto pode ser reciclado pelo coletor de lixo. Como o objeto não contém mais outras referências fortes no momento, mesmo os pontos fracos para o objeto não podem impedir que o coletor de lixo recicleva o objeto. Por outro lado, se o objeto contiver uma referência suave, o objeto contador não será reciclado imediatamente, a menos que a JVM exija memória. As referências suaves em Java são representadas pela classe Java.lang.ref.softreference.
A cópia do código é a seguinte:
Contador prime = novo contador ();
SoftReference Soft = New Softreference (Prime);
Prime = nulo;
Depois que a referência forte está vazia, o segundo comportamento do código, contador, cria uma referência suave. Dada essa diferença entre referências suaves e referências fracas, as referências suaves são mais adequadas para mecanismos de cache, enquanto as referências fracas são mais adequadas para armazenar metadados. Outro exemplo de uso de referências fracas é o fracashashmap, que é outra implementação da interface do mapa além do hashmap e Treemap. O fracoHashmap tem uma característica: as chaves no mapa são encapsuladas como referências fracas, o que significa que, uma vez que a referência forte é excluída, as referências fracas dentro do mapa fraco não podem impedir que o objeto seja coletado pelo coletor de lixo.
A referência virtual é a terceira referência disponível no pacote java.lang.ref, representado pela classe java.lang.ref.phantomreference. Objetos com referências virtuais podem ser recicladas pelo coletor de lixo a qualquer momento. Semelhante a referências fracas e referências suaves, você pode criar referências virtuais através do seguinte código:
A cópia do código é a seguinte:
DigitalCounter Digit = novo DigitalCounter ();
Phantomreference Phantom = New Phantomreference (Digit);
dígito = nulo;
Depois que a forte referência é removida, o objeto DigitalCounter na terceira linha pode ser reciclado pelo coletor de lixo a qualquer momento. Como existe apenas uma referência virtual apontando para o objeto, a referência virtual não pode impedir que o coletor de lixo recupere o objeto.
Além de entender referências fracas, referências suaves, referências virtuais e fracoshashmap, você também precisa entender o ReferenceQueue. No processo de criação de referências fracas, referências suaves e referências virtuais, você pode fornecer a fila de referência Referência para o seguinte código:
A cópia do código é a seguinte:
ReferenceQueue refqueue = new ReferenceQueue ();
DigitalCounter Digit = new DigitalCounter ();
Phantomreference <DigitalCounter> Phantom = new PhantomReference <DornCounter> (Digit, RefQueue);
As instâncias de referência são adicionadas à fila de referência e você pode reciclar objetos, consultando a fila de referência a qualquer momento. O ciclo de vida de um objeto pode ser descrito na figura abaixo: