JVM 메모리 사용량은 어떻게 계산됩니까?

JVM 메모리 사용량은 어떻게 계산됩니까?

Elasticsearch 클러스터를 조정하고 있는데 일관되지 않은 메모리 사용량을 발견했습니다. free내 인스턴스에서 " " 실행:

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

30GB우리는 그것을 기계에서 봅니다.

ES는 사용 가능한 메모리의 50%(또는 OOP로 인해 최대 30GB)를 사용하도록 조정되었습니다. 여기서 확인할 수 있으며 -Xms플래그 -Xmx는 다음과 같이 설정되어 있습니다 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

그러나 "top"을 실행하면 다른 이야기가 나타납니다.

%MEM에 위치하면 여러 번 이상 59%표시됩니다 (nagios 경고 트리거).85%

  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

답변1

힙 크기를 15GB로 제한했지만 JVM은 그 이상, 즉 스택 및 기본 메모리를 사용하며 그 중 일부는 JVM(메타공간)에서 관리됩니다.

pmap -x <pid>명령은 추가 2.5GB가 사용되는 위치(스택, 힙)를 식별하는 데 도움이 될 수 있습니다.

ps -o nlwp <pid>명령은 스레드 수를 제공합니다. 귀하의 경우 각 스레드는 1MB의 메모리를 소비하므로 1000개의 스레드는 1GB를 사용합니다.

jstat -gc <pid>명령은 MU 열 아래에 사용된 메타스페이스의 크기를 표시합니다.

메타스페이스에서 메모리를 사용하는 경우 다음 옵션을 사용하여 메모리를 제한할 수 있습니다.

-XX:MaxMetaspaceSize=1g

관련 정보