Essa área de memória (“Permanent Generation”) é característica da implementação da Sun da JVM, e é por isso que não entra na sua apostila de certificação, embora dê muita dor de cabeça na prática para quem roda application servers ou web containers como o Tomcat, Glassfish etc.
Como a Oracle, além de ter comprado a Sun, comprou uma empresa (BEA) que havia escrito uma JVM (JRockit) que não usa Permanent Generation, eles resolveram juntar progressivamente os produtos.
[quote=dudu795]Estava olhando as notícias, vendo a palava PermGen, me chamou a atenção, pois a alguns dias atrás, uma aplicação funcionava em minha máquina, após passá-la para um colega, ocorreu erro ao executar, alegando que a memória PermGen havia sido esgotada, pesquisei o erro, e a solução que ofereciam deu certo, compilei o jar aumentando esta memória, com o comando java -jar -XX:MaxPermSize=256m mas confesso que não entendi o funcionamento esta memória, quando ela é utilizada e por que, sou certificado em java, e no livro que li, as diferenças mencionadas era heap e pilha, pelo que me lembre não havia citação desta memória, se puderem me esclarecer o por que ela existe?
Obrigado.[/quote]
Permgen é uma memória que guarda objetos que estão referenciados no seu programa se não me engano em 3 níveis de geração. A geração mais nova é passível de ser coletada enquanto as mais profundas são objetos mais críticos para o funcionamento do programa. Alguns desses são reaproveitados, mas o programa fica gordo demais. Foi uma cagada que fizeram logo de início e está sendo corrigida.
Só pra botar um pouco de lenha na fogueira, uma alteração na JDK pode mudar a forma como algumas otimizações de VM (Argumentos da VM) trabalham.
Quando se trabalha com a JVM rodando em todos os seus padrões, normalmente não há problemas de compatibilidade, mas o mesmo não é necessariamente uma verdade quando se passa argumentos para que a VM trabalhe de modo diferenciado do padrão.
Acredito e espero que essas mudanças causem pouco ou nenhum impacto.