Como meu jre excede seus limites de heap?

4

Eu tenho um jvm cujo uso real da memória está bem acima dos limites com os quais ele está sendo lançado. É uma VM Sun:

root@jira:/opt/atlassian/jira/jre# ./bin/java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)

e ele foi configurado com um heap máximo de 768 MB ( -Xmx768m ) e um limite máximo de 256 MB ( -XX:MaxPermSize=256m ), mas os processos estão passando de 1 GB, atualmente em 1,7 GB.

Estou acostumado a aplicativos Java com vazamentos de memória matando-se com OutOfMemoryErrors quando eles excedem seus limites, não sendo mortos externamente quando o Linux OOMKiller começa a gravar processos.

De ps :

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
jira     23030  2.7 70.5 2181356 1457748 ?     Sl   Nov30  34:52 /opt/atlassian/jira/jre//bin/java -Djava.util.logging.config.file=/opt/atlassian/jira/conf/logging.properties -XX:MaxPermSize=256m -Xms256m -Xmx768m

Há 1,5 GB e ele continuará crescendo até que a caixa de 2 GB comece a trocar.

O que estou entendendo mal sobre os limites de memória da JVM?

    
por Ry4an Brase 01.12.2011 / 20:08

2 respostas

4

O limite do heap é o limite do heap da JVM apresentado para aplicativos Java (nenhum programa Java pode alocar mais que a quantidade de espaço no heap), mas não limita o tamanho do processo Java (que inclui o heap da JVM) que você está limitando, além de quaisquer itens alocados pela própria JVM, mais a pilha (para a JVM e seu aplicativo Java), além de outras coisas que eu quase com certeza estou deixando de fora.

Normalmente você não verá muito mais do que 10-15% de aumento nos limites definidos, mas casos patológicos provavelmente existem, e pode até haver um vazamento de memória ou outro bug no próprio Java Runtime (depuração de boa sorte que porco).

Se você quiser limitar o tamanho do Java Runtime no nível do sistema operacional, você provavelmente deve procurar o ulimit . A JVM pode manipular esses limites normalmente.

    
por 01.12.2011 / 21:29
2

Existe a área off-heap, que inclui memória alocada pelo código JNI e pelos buffers Direct Byte. Você pode controlar o último usando -XX:MaxDirectMemorySize .

    
por 11.05.2012 / 01:14

Tags