Erro PermGen em Java, enquanto o uso de memória parece baixo

5

O aplicativo Java morre de tempos em tempos com erro de espaço do PermGen, mas quando olho para o uso de memória parece baixo do que eu posso dizer.

É um aplicativo do Tomcat, além de haver um servidor SOLR em execução (sob o mesmo tomcat).

Parâmetros da JVM em catalina.sh :

-Xms1024m 
-Xmx2048m 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/path/to/logs

Erro em catalina.out :

java.lang.OutOfMemoryError: PermGen space
Dumping heap to /path/to/logs/java_pid22335.hprof ...
Heap dump file created [107041478 bytes in 1.823 secs]
Exception in thread "pool-5-thread-1" java.lang.OutOfMemoryError: PermGen space

Agora, a primeira coisa estranha é que o despejo de memória é de apenas 100Mb, enquanto o limite de heap é de 2048Mb. Quando eu costumava ter erros de memória insuficientes "corretos", o arquivo de despejo estava próximo em tamanho ao limite de heap.

A segunda coisa estranha é que o uso da memória mostrado por jmap -heap 22335 parece bastante normal (quando este comando foi executado, o aplicativo java ainda estava inativo):

Attaching to process ID 22335, please wait...   
Debugger attached successfully.
Server compiler detected.
JVM version is 11.3-b02

using thread-local object allocation.
Parallel GC with 16 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 2686976 (2.5625MB)
   MaxNewSize       = -65536 (-0.0625MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 88080384 (84.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 566689792 (540.4375MB)
   used     = 13467648 (12.84375MB)
   free     = 553222144 (527.59375MB)
   2.3765467792297907% used
From Space:
   capacity = 327680 (0.3125MB)
   used     = 0 (0.0MB)
   free     = 327680 (0.3125MB)
   0.0% used
To Space:
   capacity = 327680 (0.3125MB)
   used     = 0 (0.0MB)
   free     = 327680 (0.3125MB)
   0.0% used
PS Old Generation
   capacity = 1431699456 (1365.375MB)
   used     = 86216248 (82.22222137451172MB)
   free     = 1345483208 (1283.1527786254883MB)
   6.021951579200712% used
PS Perm Generation
   capacity = 88080384 (84.0MB)
   used     = 88080080 (83.99971008300781MB)
   free     = 304 (2.899169921875E-4MB)
   99.99965486072358% used

Eu olhei para o arquivo de despejo de memória, nada de anormal lá. Tentei aumentar o limite de heap, sem diferença.

Alguma idéia do que poderia ser e por que o arquivo de despejo é tão pequeno, assim como o uso de memória enquanto o aplicativo continua jogando fora os erros de memória?

    
por serg 11.08.2012 / 01:58

2 respostas

6
PS Perm Generation
   capacity = 88080384 (84.0MB)
   used     = 88080080 (83.99971008300781MB)
   free     = 304 (2.899169921875E-4MB)
   99.99965486072358% used

Existe o seu culpado. O PermGen é usado para definições de classes e você parece ter muitas delas!

Tente aumentar o tamanho do seu PermGen adicionando isso às suas opções de lançamento do Tomcat:

-XX:MaxPermSize=256M

... mas se a sua aplicação está a atingir o seu limite atual, esta alteração apenas lhe dará algum tempo extra entre falhas.

Monitore como ele se comporta e a rapidez com que o uso cresce, mas esteja pronto para fazer algumas pesquisas no código do aplicativo para definições de classe de problema.

    
por 11.08.2012 / 02:09
3

O tamanho Max PermGen é definido por uma opção de linha de comando separada, tente -XX:MaxPermSize=128M , que deve ser suficiente para o PermGen.

    
por 11.08.2012 / 02:09