首页 > 解决方案 > 生产环境下Rocketmq broker进程内存比例问题

问题描述

我的问题是:通过Linux系统命令查看的内存使用量与java内存各个区域的总使用量,以及哪个区域正在使用内存,存在巨大差异。

版本:

java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

rocketMq version : 4.5.1

CentOS Linux release 7.4.1708 (Core)

ps 辅助|grep java :

1408 4.4 60.7 33395552 19596884 ?Sl Mar22 7734:05 /bin/java -server -Xms1g -Xmx2g -Xmn1g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking -Djava.ext.dirs=/jre/lib/ext:/data/mq/rocketmq-all-4.5 .1-bin-release/bin/../lib -cp .:/data/mq/rocketmq-all-4.5.1-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartupautoCreateTopicEnable=true -c /data/mq/rocketmq-all-4.5.1-bin-release/conf/2m-noslave/broker-a.properties

PID:1408

最佳 :

PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令

1408 根 20 0 31.848g 0.018t 1.399g S 10.0 60.8 7734:02 java

RES:0.018吨

cat /proc/1408/status |grep 虚拟机:

VmPeak: 37749060 kB
VmSize: 33395552 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:  22155452 kB
VmRSS:  19603060 kB
VmData: 27929052 kB
VmStk:       132 kB
VmExe:         4 kB
VmLib:     19900 kB
VmPTE:     43660 kB
VmSwap:        0 kB

VmRSS: 19603060 kB -> ~18G

我用上面的系统命令确定broker进程内存占用18G左右

实际分配给java的堆空间最大为2G -Xms1g -Xmx2g -Xmn1g

jstat -gc 1408 :</p>

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

0.0 16384.0 0.0 16384.0 1097728.0 98304.0 442368.0 246238.9 79996.0 78497.1 10136.0 9709.5 111588 1343.763 0 0.000 1343.763

OC:432M S0C + S1C:32M EC:1072M MC:78M CCSC:9.8M

然后通过arthas工具:查看DirectMemory

在此处输入图像描述

直通:4M 映射:5154M

由上可知,java占用的内存大致为:

Javaheap + 元空间 + 线程数(217) * 256k + 代码缓存 + 直接内存 = 2 * 1024 + 78 + 217*256/1024 + 9.8 + 5 = 2194.8

即使包括映射的5154M,java进程也只有7348.8M

18G的比例差别很大。

这里的10G+差距是多少?

标签: javajvmrocketmq

解决方案


推荐阅读