Como o uso de memória da JVM é calculado?

1

Estou ajustando meu cluster do Elasticsearch e vejo que o uso de memória não está alinhado. Executando " free " na minha instância:

free
              total        used        free      shared  buff/cache   available
Mem:       30881324    17072320      238216       49736    13570788    13313528
Swap:             0           0           0

Vemos que há 30GB na máquina.

ES foi ajustado para usar 50% da memória disponível (ou no máximo 30 GB por motivos opcionais) e posso verificar, aqui, que os sinalizadores -Xms e -Xmx estão definidos como 15078m :

/bin/java -Xms15078m -Xmx15078m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet

Mas ao executar o "top", vemos uma história diferente.

%MEM está em 59% , muitas vezes mostrará 85% ou mais (acionando alertas nagios):

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
24366 elastic+  20   0   54.9g  17.5g   1.6g S 267.7 59.3   1849:57 java
    
por Avner Barr 07.08.2018 / 09:44

1 resposta

1

Você limitou o tamanho do heap a 15 GB, mas a JVM está usando mais do que isso: pilha e memória nativa, algumas das quais são gerenciadas pela JVM (metaspace).

O comando pmap -x <pid> pode ajudar a identificar onde os 2,5 GB extras são usados, pilha, heap.

O comando ps -o nlwp <pid> fornecerá o número de encadeamentos. Cada thread está consumindo 1 MB de memória no seu caso, então mil threads usarão 1 GB.

O comando jstat -gc <pid> mostrará o tamanho do metaspace usado na coluna MU.

Se a memória é usada pelo metaspace, você pode limitar seu uso usando esta opção:

-XX:MaxMetaspaceSize=1g
    
por 26.09.2018 / 02:22