TL;DR
- 场景: RocketMQ 4.5.1 在 JDK9+ 启动被「废弃/移除的 JVM 参数」和「类路径未加载 lib」卡住。
- 结论: 删除 CMS/ParNew 与 java.ext.dirs,GC 日志切 -Xlog,CLASSPATH 补 ${BASE_DIR}/lib/*。
- 产出: runserver/runbroker/tools 三处最小改动清单 + 版本矩阵 + 错误速查卡。
RocketMQ 环境搭建
软件下载
cd /opt/software
wget https://archive.apache.org/dist/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip
解压移动
unzip rocketmq-all-4.5.1-bin-release.zip
mv rocketmq-all-4.5.1-bin-release ../server/rocketmq
修改脚本
需要修改以下三个文件:
bin/runserver.shbin/runbroker.shbin/tools.sh
runserver
修改内容:
删除以下参数:
- UseCMSCompactAtFullCollection
- UseParNewGC
- UseConcMarkSweepGC
修改内存配置:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=160m"
修改GC配置:
将 -Xloggc 修改为 -Xlog:gc
CLASSPATH 补充:
export CLASSPATH=".:${BASE_DIR}/conf:${BASE_DIR}/lib/*"
broker
修改内容:
修改 JVM 参数:
-Xms256m -Xmx256m -Xmn128m
删除以下参数:
- PrintGCDateStamps
- PrintGCApplicationStoppedTime
- PrintAdaptiveSizePolicy
- UseGCLogFileRotation
- NumberOfGCLogFiles=5
- GCLogFileSize=30m
删除:
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
CLASSPATH 补充:
export CLASSPATH=".:${BASE_DIR}/conf:${BASE_DIR}/lib/*"
tools
删除:
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext"
CLASSPATH 补充:
export CLASSPATH=".:${BASE_DIR}/conf:${BASE_DIR}/lib/*"
针对修改的解释
runserver:删除 CMS/ParNew 相关参数 + 换 GC 日志体系 + 改内存
删除以下参数的原因:
UseConcMarkSweepGC(CMS)在 JDK9 就被标记为 deprecated,后续版本彻底移除UseParNewGC是 CMS 时代常见的年轻代收集器搭配项UseCMSCompactAtFullCollection是 CMS 体系内的 Full GC 压缩控制项- JDK9 起默认 GC 已经切换到 G1
-Xloggc 改为 -Xlog:gc:JDK9 引入 Unified JVM Logging(统一日志框架),GC 日志也随之迁移到 -Xlog 体系。
broker:删掉一批 GC 日志旧参数
删除的参数包括:
- PrintGCDateStamps
- PrintGCApplicationStoppedTime
- PrintAdaptiveSizePolicy
- UseGCLogFileRotation
- NumberOfGCLogFiles
- GCLogFileSize
这些都属于 JDK8 及以前的”老 GC 日志开关 + 老日志轮转方式”,JDK9+ 统一切到 -Xlog 后,这些要么被忽略、要么报 deprecated/obsolete。
tools:删除 -Djava.ext.dirs=…
-Djava.ext.dirs 依赖的是 JRE 的 extension classloader 机制。这个机制在 JDK9 因模块化运行时(JPMS)被移除;只要设置该属性,启动器就可能直接失败。
环境变量
vim /etc/profile
# RocketMQ 环境变量
export ROCKET_HOME="/opt/server/rocketmq"
export PATH="${ROCKET_HOME}/bin:$PATH"
刷新环境变量:
source /etc/profile
启动服务
NameServer
mqnamesrv
查看日志:
tail -f ~/logs/rocketmqlogs/namesrv.log
Broker
mqbroker -n 0.0.0.0:9876
查看日志:
tail -f ~/logs/rocketmqlogs/broker.log
服务测试
发送消息
设置环境变量:
export NAMESRV_ADDR=0.0.0.0:9876
使用官方提供的 Demo:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| Unrecognized VM option ‘UseConcMarkSweepGC’ 或直接退出 | JDK9+ 移除/废弃 CMS/ParNew 体系参数 | 从 runserver.sh 删除 UseConcMarkSweepGC/UseParNewGC/UseCMSCompactAtFullCollection |
| GC 日志参数告警/不生效(-Xloggc、PrintGCDateStamps 等) | JDK9+ 统一日志体系迁移到 -Xlog | 将 -Xloggc 改为 -Xlog:gc;删除老式 GC 日志参数 |
| Error: Could not find or load main class org.apache.rocketmq.namesrv.NamesrvStartup | CLASSPATH 未包含 ${BASE_DIR}/lib/* | 将 export CLASSPATH=".:${BASE_DIR}/conf:${BASE_DIR}/lib/*" 固化到脚本 |
| tools.sh 执行 Demo 报 ClassNotFound / 直接启动失败 | -Djava.ext.dirs=… 依赖 JRE ext 机制,JDK9 起移除 | 删除 JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=..." |
| JVM 启动时报 Invalid -XX:MetaspaceSize=… | 参数单位/拼写错误(如 64mm) | 修正为 -XX:MetaspaceSize=64m |
| 环境变量设置后仍找不到命令 | 脚本引用目录不一致、变量名不一致 | 检查 bin 脚本对 HOME 变量的读取 |