Como o java permgen se relaciona com o tamanho do código

1

Eu tenho lido muito sobre o gerenciamento de memória java, coletando lixo e estou tentando encontrar as melhores configurações para minha memória limitada (1.7g em uma pequena instância ec2) Eu estou querendo saber se existe uma correlação direta entre o tamanho do meu código e a configuração do permgen. De acordo com o sol:

The permanent generation is special because it holds data needed by the virtual machine to describe objects that do not have an equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

Para mim, isso significa que ele está literalmente armazenando minha classe def'ns etc ... Isso significa que há uma correlação direta entre o tamanho do meu código compilado e o permgen que eu deveria estar configurando? Meu aplicativo inteiro é de cerca de 40mb e notei que estamos usando 256mb permgen. Eu estou pensando que talvez nós estamos usando a memória que poderia ser melhor alocada para o código dinâmico, como instâncias de objetos, etc ...

    
por brad 10.03.2010 / 16:36

2 respostas

1

O seu Tomcat está configurado para reimplementar automaticamente os aplicativos que são descartados na pasta do aplicativo? Você usa essa funcionalidade?

Se você usar essa funcionalidade, existe a possibilidade de que a quantidade de memória usada no espaço do PermGen vá aumentar. Isto pode acontecer devido a aplicações (mal escritas) que de alguma forma mantêm referências às classes carregadas vivas. Cada vez que há uma redistribuição, a quantidade de memória usada no espaço do PermGen vai aumentar até transbordar.

Se você não usar essa funcionalidade e sempre tiver o mesmo aplicativo em execução no servidor Tomcat, tente executar o Tomcat com as configurações padrão para o espaço PermGen. Se o aplicativo for carregado e funcionar bem por algum tempo, ele deverá ficar bem. Se o aplicativo ficar sem espaço PermGen, basta aumentá-lo em etapas até que o espaço PermGen seja grande o suficiente.

Por que ele foi configurado para 256m (como visto em sua outra pergunta) em primeiro lugar?

Btw, sim, há uma correlação entre a quantidade de classes carregadas e a quantidade de espaço necessário na área do PermGen. Então, sim, quanto mais código for carregado, mais espaço no PermGen você precisará.

    
por 12.03.2010 / 13:05
1

A Sun diz que o permgen é armazenamento para objetos que não têm equivalência na linguagem Java:

A third generation closely related to the tenured generation is the permanent generation. The permanent generation is special because it holds data needed by the virtual machine to describe objects that do not have an equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

Então, sim, a geração permanente contém estruturas de dados da JVM "interna" que descrevem objetos e métodos, entre outras coisas. 256 MB pode ser bastante grande, mas dependerá do aplicativo.

Em um aplicativo grande do ColdFusion como eu corro, uma enorme quantidade de classes é criada para o código do ColdFusion que é compilado on-the-fly, e eu estou correndo com uma geração permanente definida para 192 MB. Eu acho que eu costumava executá-lo com sucesso em 128 MB também, então é definitivamente algo que você poderia experimentar.

Se você estiver medindo o desempenho em carga antes e depois de ajustar esses parâmetros do GC, poderá identificar o impacto que suas alterações têm no desempenho do seu aplicativo.

Além disso, o documento que eu vinculei dá muita informação sobre como a JVM gerencia sua memória - é uma boa leitura.

    
por 10.03.2010 / 17:23

Tags