java - 生产环境下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+差距是多少?
解决方案
推荐阅读
- networking - 如何在无根 podman 中发布用户定义网络中的端口?
- php - 使用 php 读取和插入部分 csv 文件 - 不希望重复数据
- django - 如何自定义 Django 更改密码表单的外观
- atom-editor - 为什么两个 console.log() 语句都在 atom live server 中显示 id
- sql - 有效地在具有外键约束的两行之间强制执行 1:1 关系,而无需创建冗余唯一索引
- python - 从封闭的多段线创建 REGION - EZDXF
- python - 在具有相应索引的列表中添加数字
- h2 - H2 设置架构更改 schema_search_path
- flutter - Flutter 中的快照是什么?
- ruby-on-rails - 视图中的 Rails 助手 - 如何渲染助手的结果?