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%,很多时候会显示85%或更多(触发 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

答案1

您已将堆大小限制为 15 GB,但 JVM 使用的容量不止于此:堆栈和本机内存,其中一些由 JVM(元空间)管理。

pmap -x <pid>命令可能有助于识别额外的 2.5 GB 的使用位置:堆栈、堆。

ps -o nlwp <pid>命令将为您提供线程数。在您的情况下,每个线程消耗 1MB 内存,因此一千个线程将使用 1GB。

jstat -gc <pid>命令将在 MU 列下显示已用元空间的大小。

如果内存被元空间使用,您可以使用此选项限制其:

-XX:MaxMetaspaceSize=1g

相关内容