Pool de Strings  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
jbjares
JavaChild
[Avatar]

Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline

Olá pessoal,

Alguem sabe explicar o escopo da permanencia de Strings no pool. Quando exatamente ela vai para o pool e quando ela deixa de existir no pool. Quando posso considerar que uma variavel de referencia irá referenciar uma string do pool ou criará uma nova? A String existirá no pool enquanto existir variaveis lhe referenciando ou mesmo depois de perdida permanecerá no pool?

This message was edited 1 time. Last update was at 16/03/2009 18:17:22

[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

Todas as Strings declaradas de maneira literal vão para o pool...É uma maneira da JVM otimizar seu desempenho em runtime. Portanto em sua primeira checagem é colocado no pool todas as String de valor literal presentes no momento, e as referências feitas a uma String literal de mesmo valor, vão apontar para a mesma "instância" no pool.

Alguns exemplos simples:

Apenas sendo criada uma instancia de valor "java" no pool...nenhum objeto criado na heap:


Uma string "java" criada no pool e um objeto String na heap:



Se vc fizer isso, as duas variáveis vão apontar para a mesma instância no pool:

This message was edited 2 times. Last update was at 16/03/2009 19:47:02

brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

Ah sim... Li há um tempo atrás q não é possível saber ao certo quando (ou SE) é feita a limpeza do pool...
Garbage Collector não atua ali.

Por sorte não é um conhecimento necessário para a prova.

jbjares
JavaChild
[Avatar]

Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline

Caro brrodo,


Apenas sendo criada uma instancia de valor "java" no pool...nenhum objeto criado na heap:



Até então pensava que com o literal um novo objeto fosse criado no heap e no pool. É isso mesmo?


Uma string "java" criada no pool e um objeto String na heap:



No exemplo acima pensava estar sendo criadas dois objetos string no heap onde o literal iria para o pool.


E em relação ao Garage Collector. Como poderei saber quantos objetos String estarão elegiveis ao coletor caso exista a repetição de strings (a reutilização de uma string do pool) se não se pode prever a forma de limpeza deste pool? Ainda não ficou claro para mim.
[Email]
taaqui
JavaEvangelist
[Avatar]

Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline

So para deixar bem claro, o código a seguir não cria nada no pool de strings, uma string criada com new so pode fazer parte do pool quando se usa o método intern() para essa string.



Sobre o Garbage Collector, vou dar um pequeno exemplo a seguir



A string pato, após a 3 linha vai ficar legível para o coletor de lixo.
Me corrijam se estiver errado.

This message was edited 1 time. Last update was at 17/03/2009 08:59:39


SCJP-SCWCD-SCBCD
[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

Exemplo citado no livro K&B - SCJP Sun Certified Programmer for Java 5 Study Guide wrote:
String s = "abc"; // creates one String object and one reference variable
In this simple case, "abc" will go in the pool and s will refer to it.

String s = new String("abc"); // creates two objects, and one reference variable
In this case, because we used the new keyword, Java will create a new String object in normal (non-pool) memory,
and s will refer to it. In addition, the literal "abc" will be placed in the pool.


jbjares wrote:Caro brrodo,


Apenas sendo criada uma instancia de valor "java" no pool...nenhum objeto criado na heap:



Até então pensava que com o literal um novo objeto fosse criado no heap e no pool. É isso mesmo?


Neste caso, nenhum objeto é criado na heap, apenas na pool, e a variável "str" fará referência a ele.
Talvez vc esteja confundindo o comportamento das strings neste caso com um "autoboxing".

jbjares wrote:
brrodo wrote:

Uma string "java" criada no pool e um objeto String na heap:



No exemplo acima pensava estar sendo criadas dois objetos string no heap onde o literal iria para o pool.


Já neste caso, a string literal "java" irá para o pool, e um objeto new String("java") estará na heap. A variável str fará referência ao objeto na heap.

jbjares wrote:
E em relação ao Garage Collector. Como poderei saber quantos objetos String estarão elegiveis ao coletor caso exista a repetição de strings (a reutilização de uma string do pool) se não se pode prever a forma de limpeza deste pool? Ainda não ficou claro para mim.


Lembre-se que o Garbage Collector só atua na heap. Portanto o que eu quis dizer é q até onde eu sei (...e pelas fontes que consultei), a limpeza do pool não pode ser precisada, ou seja, não há nenhum mecanismo responsável pela limpeza desta área de memória ocupada em específico. Caso alguém saiba mais sobre isso, pode complementar o que eu disse aqui.

Com essas informações acho q já dá pra concluir quais objetos serão, ou não, candidatos ao GC.


Pra complementar esse tema, vale a pena olhar esse post aqui. Uma questão interessante de "Strings in pool":
http://www.guj.com.br/posts/list/116352.java

This message was edited 5 times. Last update was at 17/03/2009 09:41:42

taaqui
JavaEvangelist
[Avatar]

Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline



Se estiver errado me corrijam.

This message was edited 1 time. Last update was at 17/03/2009 10:21:13


SCJP-SCWCD-SCBCD
[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

taaqui wrote:

Se estiver errado me corrijam.


Desta meneira que vc representou há 2 strings literais "java" no pool.

Na verdade só haverá 1.
taaqui
JavaEvangelist
[Avatar]

Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline

Acho que não, se fosse assim eu faria



e teria que dar true por esta referenciando o mesmo id no pool de strings?

This message was edited 2 times. Last update was at 17/03/2009 10:40:27


SCJP-SCWCD-SCBCD
[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

taaqui wrote:Acho que não, se fosse assim eu faria



e teria que dar true por esta referenciando o mesmo id no pool de strings?


Não. Repare q vc está usando o operador "==".

Ele só retornará true caso as duas variáveis comparadas façam referencia ao mesmo objeto...Mas...
s1 se refere a um objeto String na heap.
s2 se refere a uma string literal no pool.
Logo, o retorno será "false".


O que vc tentou fazer na verdade é isso:



Repare q agora sim a variável s1 recebeu o valor que está na pool...e agora o sim vc verá que a comparação retornará "true", confirmando o q eu disse.

This message was edited 1 time. Last update was at 17/03/2009 10:49:33

jbjares
JavaChild
[Avatar]

Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline

Olá Amigos,
Desculpem a demora em responder essa semana está sendo bastante pesada em meu trabalho. Agradeço muito o apoio de brrodo e taaqui, ta bem legal a discussão.
Quando lí essa mesma parte do livro da K.Sierra que o brrodo citou eu entendi que dois objetos String são criados sendo que o mais interno, o que é passado como argumento ao construtor da classe String irá para o pool, por se tratar de um literal, mas em nenhum momento eu havia lido sobre esse detalhe de que só os literais vão para o pool ou que não são criados objetos no heap para estes. Para mim ainda não está claro.

String s = new String("abc"); // creates two objects, and one reference variable
In this case, because we used the new keyword, Java will create a new String object in normal (non-pool) memory,
and s will refer to it. In addition, the literal "abc" will be placed in the pool.


Achei inclusive bastante interessante aquela discussão que o brrodo citou aqui no forum da questão do testkiller. Para mim aquela questão está mal elaborada... Eu entendi que são criadas 5 Objetos String sendo que de certeza mesmo caso "Fred" e "47" já estivessem no pool só foram criadas 3. Então no meu ponto de vista a pergunta deveria ser: "Quantos objetos String serão criados COM CERTEZA quando este método for chamado?" Aí sim a resposta seria 3. letra C.



O que vocês acham??
[Email]
taaqui
JavaEvangelist
[Avatar]

Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline

Também estou com um merda de um mosquito zunindo no meu ouvido sobre isso, então vamos la, para onde vai o literal criado no objeto String s1 = new String ("abacaxi");? para o pool certo? então como String s4 = "abacaxi"; ja se encontra no pool ele vai referencia o abacaxi ja criado no pool?

olha a figura
Ps: adorei fazer essas coisas ^^

This message was edited 1 time. Last update was at 18/03/2009 18:46:19


SCJP-SCWCD-SCBCD
[Email]
jbjares
JavaChild
[Avatar]

Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline

AUhuaUHAUhaUHUA Esses gráficos são bem legais mesmo taaqui...

Cara,

Vamos pegar a explicação da K.Sierra a respeito da criação de String. Comentarei os pontos críticos com (A,B,C,D...) para analisarmos melhor um a um.


Creating New Strings
Let's look at a couple of examples of how a String
might be created, and let's further assume that no other String objects exist in the
pool:
String s = "abc"; // creates one String object -- (A)
// and one reference variable
In this simple case, "abc" will go in the pool and s will refer to it. -- (B)
String s = new String("abc"); // creates two objects, -- (C)
// and one reference variable
In this case, because we used the new keyword, Java will create a new String object
in normal (nonpool) memory, and s will refer to it. -- (D)
In addition, the literal "abc" will -- (E)
be placed in the pool.



A) Um novo Objeto String é criado.
B) "abc" vai para o pool e "s" o referenciará. Então podemos pensar no pool de String como sendo um pool de objetos String e não em um pool de literais, Certo?
C) São criados dois Objetos String.
D) Por utilizar a palavra-chave new será criado um Objeto String no Heap e "s" o referenciará.
E) Adicionalmente o literal "abc" será inserido no pool. Neste ponto a coisa se complica. A lógica do tópico B) é exterminada quando ela diz que o literal "abc" vai para o pool, concorda? Então de que é composto esse pool, de Objetos ou literais? Caso ele seja composto por literais oque acontece com o Objeto criado no tópico A)? O lugar dos novos objetos não é o Heap? Então no tópico A) é criado um novo Objeto String que vai para o Heap e um literal que vai para o pool, mas a variável referencia o literal do pool no lugar do Objeto que foi para o Heap?

Está lançado o desafio. Vamos desmistificar de uma vez por todas aqui no GUJ o que de fato acontece no momento da criação de Strings!!!
[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

jbjares wrote:AUhuaUHAUhaUHUA Esses gráficos são bem legais mesmo taaqui...

Cara,

Vamos pegar a explicação da K.Sierra a respeito da criação de String. Comentarei os pontos críticos com (A,B,C,D...) para analisarmos melhor um a um.


Creating New Strings
Let's look at a couple of examples of how a String
might be created, and let's further assume that no other String objects exist in the
pool:
String s = "abc"; // creates one String object -- (A)
// and one reference variable
In this simple case, "abc" will go in the pool and s will refer to it. -- (B)
String s = new String("abc"); // creates two objects, -- (C)
// and one reference variable
In this case, because we used the new keyword, Java will create a new String object
in normal (nonpool) memory, and s will refer to it. -- (D)
In addition, the literal "abc" will -- (E)
be placed in the pool.



A) Um novo Objeto String é criado.
B) "abc" vai para o pool e "s" o referenciará. Então podemos pensar no pool de String como sendo um pool de objetos String e não em um pool de literais, Certo?
C) São criados dois Objetos String.
D) Por utilizar a palavra-chave new será criado um Objeto String no Heap e "s" o referenciará.
E) Adicionalmente o literal "abc" será inserido no pool. Neste ponto a coisa se complica. A lógica do tópico B) é exterminada quando ela diz que o literal "abc" vai para o pool, concorda? Então de que é composto esse pool, de Objetos ou literais? Caso ele seja composto por literais oque acontece com o Objeto criado no tópico A)? O lugar dos novos objetos não é o Heap? Então no tópico A) é criado um novo Objeto String que vai para o Heap e um literal que vai para o pool, mas a variável referencia o literal do pool no lugar do Objeto que foi para o Heap?

Está lançado o desafio. Vamos desmistificar de uma vez por todas aqui no GUJ o que de fato acontece no momento da criação de Strings!!!


taaqui agora está certo.

jbjares, eu acho q essas dúvidas q vc teve agora já foram explicadas nos posts anteriores. Em A) é criado um "objeto" (entre aspas, pois vc está sempre vinculando objeto à heap, mas não é este o caso aqui) no pool apenas, nada é feito na heap.

jbjares, o gráfico do taaqui agora está correto, se olhar ele, vai entender melhor o q acontece em E).


...e lembre-se que não há como o pool ser afetado pelo GC.

This message was edited 1 time. Last update was at 19/03/2009 07:26:00

jbjares
JavaChild
[Avatar]

Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline

Caro brrodo,

Concordo que o exemplo do taaqui está coerente. É isso mesmo! Valeu pessoal.
[Email]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team