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.sh
  • bin/runbroker.sh
  • bin/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.NamesrvStartupCLASSPATH 未包含 ${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 变量的读取