String em java

Bom dia pessoal, sei que ando mais perguntando do que respondendo ultimamente, mas para o pessoal mais experiente em java pode me ajudar numa dúvida com memória em java.

Na revista mundo java nº 35 (março/abril 2009), nas páginas 15 á 25 (seção professor J), o autor diz que as strings em java vão para uma área de memória chamada PERM GEN (Permanente), e que essa memória é FORA do HEAP. Mas a vida inteira eu ouvi dizer que as strings em java como objetos imutáveis ficam em uma área de memória chamada heap de memória ou heap de strings. Bem como dizem que o pool de strings é organizado por hash… e que o heap não tem organização lógica e o stack sim…

Afinal qual o certo?

Onde posso me aprofundar mais em memória no java e sobre o gabarge collector?

Obrigado.

Muita calma nesse momento.

Existe um tratamento diferente para Strings literais (ou seja, as criadas com aspas no código), e as Strings normais.
As strings literais são conhecidas no momento da compilação. Não só o Java, como praticamente todas as linguagens (inclusive o C++) movem essas strings para uma região especial de memória, organizada e compacta.

Muitos sistemas operacionais, como o próprio Windows, permite a criação de uma área de memória específica para dados imutáveis, protegida de modificações pelo próprio SO.

Como essas strings são mesmo imutáveis, a aplicação pode otimizar o uso de memória dessa forma. As strings ana e banana, por exemplo, podem ocupar a mesma região de memória, sendo ana apenas um ponteiro para as três últimas letras de banana.

Essas Strings é que vão para o permgen space. Assim como definições de classes e outras coisas imutáveis de seu código.

Agora, as Strings criadas com o new, essas irão para o heap, como você sempre ouviu falar.

[quote=wellington.nogueira]Tuning GC http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Whitepaper http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf[/quote]

Você pode indicar, nos documentos onde você passou, onde tem alguma coisa que responda a dúvida do colega? Fiz uma busca rápida neles e não encontrei.

PS: O java não usa a área do SO que falei, pois ele faz carga dinâmica de classes. Você pode também adicionar Strings por lá em runtime chamando o método intern(). Isso tem pouca performance e geralmente não é necessário. O java também usa o permgen para armazenar endereço constantes estáticas.

Ops, juro que também não tinha visto essa segunda pergunta, hehehehe…

Também existem esses ótimos artigos do Brian Goetz:
A brief history of garbage collection.
Garbage collection in the 1.4.1 JVM.
Garbage collection and performance.
Fixing the Java Memory Model, Part 1.
Fixing the Java Memory Model, Part 2.
Is that your final answer?
Urban performance legends revisited: Slow object allocation

São meio velhos, mas muito esclarecedores.

Ah sim, e existe também esse documento, sobre o novo modelo de garbage collection do Java 7, o garbage first:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.6386&rep=rep1&type=pdf

[quote=wellington.nogueira]Aliás, li em algum lugar que a declaração explícita de uma string (como “esta é uma string”) é alocada no PermGen, contruidas como uma “constante” e as Strings criadas via new vão para a heap.

Assim, toda vez que vc utilizar “esta é uma string” ele referenciaria o mesmo ponto em memória.

Ainda não achei onde vi isso.[/quote]

No meu post ali em cima? heheheheheh

Sim, foi o que expliquei. Isso está descrito na especificação da VM da Sun. Só não coloquei a citação aqui pq está meio espalhada, e escrita de um jeito não muito trivial de entender.

Pessoal, Muiiiiito obrigado, melhor impossível.

Tuning GC http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Whitepaper http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf

Acabei fazendo copy-paste e não disse qual parte que estava falando :frowning:

Aliás, li em algum lugar que a declaração explícita de uma string (como “esta é uma string”) é alocada no PermGen, contruidas como uma “constante” e as Strings criadas via new vão para a heap.

Assim, toda vez que vc utilizar “esta é uma string” ele referenciaria o mesmo ponto em memória.

Ainda não achei onde vi isso.

[quote=ViniGodoy]No meu post ali em cima? heheheheheh

Sim, foi o que expliquei. Isso está descrito na especificação da VM da Sun. Só não coloquei a citação aqui pq está meio espalhada, e escrita de um jeito não muito trivial de entender.[/quote]
Não foi bem no seu post, mas lá tbm diz. :smiley:
Era algum artigo (já tem algum tempo) mas era bem completo.
Qto ao GC do Java7, vou esperar para ver.