生产环境下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 aux|grep java :

root 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.brokerStartup autocreateTopicEnable=true -c /data/mq/rocketmq-all-4.5.1-bin-release/conf/2m-noslave/broker -a.属性

PID:1408

顶部:

PID USER PR NI VIRT RES SHR S %cpu %MEM TIME+ COMMAND

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

RES:0.018t

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 :

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 80728.0 98304.0 442368.0 78497.1 10136.0 9709.5 80728.5 80728.0 307

305 801307

超频:432M S0C + S1C: 32M 电码: 1072M 主控: 78M CCSC: 9.8M

然后通过arthas工具:查看DirectMemory

enter image description here

直连:4M 映射: 5154M

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

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

即使包含mapped 5154M,java进程也只有7348.8M

18G占比差异巨大。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)