GC e Literal String

Galera,

Sabemos que quando usamos um literal String, ele é armazenado em um lugar especial, um pool de constantes de String e que toda referência a String que recebe um mesmo literal, está apotando para o mesmo objeto String.

ex.:

String s1 = "teste";
String s2 = "teste";

if(s1 == s2){// teste verdadeiro.}

s1 = null;
s2 = null;

O fato de ele ser guardado nesse “local especial” torna o tratamento do GC para literais de String diferente dos demais objetos? Ou seja, após eu dizer que s1 e s2 tem valor null e o literal “teste” não está sendo referenciado, ele não será elegível para o GC? Ou funciona da mesma maneira e ele será elegível?

[]'s

Se não houver mais NENHUMA referência ao objeto, ele será elegível normalmente ao GC. O “pool de strings” evita o uso abusivo e descuidado de Strings, fazendo multiplas referências ao mesmo objeto.

Até!

Leia este artigo e tire suas conclusões.

ok, então funcionada como um objeto qualquer… quando não há nenhuma referência, torna-se elegível ao GC.

valeu.
[]'s

Eu errei uma questão uma vez com esse tipo de pergunta… :roll:

Isso é muito, muito sutil.
Se você leu o artigo
com atenção (e preste bastante atenção!) vai entender que strings constantes (aquelas que são declaradas dentro das classes) estão disponíveis para limpeza de lixo (mesmo que estejam “internadas” no pool de strings) se a classe correspondente estiver disponível para limpeza (o que pode ocorrer, por exemplo, se seu classloader estiver disponível para limpeza).
Em um programa normal você não faz mágicas com classloaders, portanto a limpeza de uma classe normalmente não é feita; mas em um programa que cria classloaders é perfeitamente possível que isso possa acontecer.

Eu pensei até que a questão estava errada, mas vamos lá…

Para Questões para a CERTIFICAÇÃO, como essa:

 Integer i =  0;
 Long l = 0l;
 String s = "olá enfermeira!";
 i = null;
 l = null;
 s = null;

Quantos objetos são elegíveis para o GC?

A resposta é 2!

Não lembro se peguei essa questão no whizlabs ou no JQPlus, mas lá explicava claramente que o objeto String foi lá para a terra dos Strings, também conhecida como ‘pool de Strings’, e que lá o GC não chegava…

E agora? Confio em quem?! :lol:

Como disse: em um programa NORMAL, a string que você declarou dentro da classe pertence a essa classe, e só será disponível para GC para quando a própria classe estiver disponível para GC (ou seja, nunca vai estar, porque não estamos fazendo mágicas com classloaders). Portanto a resposta do teste de certificação é 2 mesmo.

Ou seja: a explicação está correta mesmo (ele foi para a “piscina” - ou será “bilhar”? - talvez “consórcio” - das strings.)