OpenJDK16环境下ZooKeeper启动致JVM退出码2异常的解决咨询
ZooKeeper启动两类异常的解决方案
异常1:初次启动抛出Malformed \uxxxx encoding配置无效错误
触发原因
- Java自带的Properties类解析配置时,会把字符串里的反斜杠
\识别为Unicode转义起始符,要求后面必须跟u加4位十六进制数,才能组成合法的\uxxxx转义序列。Windows路径里常用的单\分隔符完全不符合这个规则,自然会触发解析报错。 - 原始配置里
dataDir行末尾没有换行,直接把clientPort=2181拼在了同一行,本身也是格式不合法的配置。
修复步骤
- 修改zoo.cfg里的dataDir路径写法,Windows环境下二选一即可:
- 把路径里的所有单反斜杠换成正斜杠
/ - 把路径里的单反斜杠换成双反斜杠
\\,匹配Properties的转义规则
- 把路径里的所有单反斜杠换成正斜杠
- 保证每个配置项单独占一行,不要把两个配置拼在同一行,删掉行尾多余的空格、不可见字符。
- 修正后的参考配置:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=C:/apache-zookeeper-3.7.0-bin/data clientPort=2181
异常2:调整路径后抛出NumberFormatException,将zoo.cfg路径识别为数字
触发原因
ZooKeeper正常的启动流程是:QuorumPeerMain类先加载解析zoo.cfg,检测到是单节点模式时,会把配置里的clientPort值传给ZooKeeperServerMain类作为启动端口。但当zoo.cfg因为格式问题解析失败时,代码分支没有正常抛出终止异常,反而把配置文件的绝对路径当成了端口参数传给了ZooKeeperServerMain;这个类本来要把收到的第一个参数转成整数当端口用,遇到非数字的路径字符串,自然就报类型转换错了。
修复步骤
- 用纯文本编辑器打开zoo.cfg,把文件编码改成UTF-8无BOM格式,避免文件开头的BOM字节触发Properties解析失败。
- 逐行核对配置内容,确保
键=值的结构里等号两边没有多余空格、没有制表符、没有混写的配置项。 - 检查系统环境变量里的
ZOOKEEPER_HOME,确保指向的是ZooKeeper解压后的根目录(就是同时包含bin、conf、lib文件夹的目录),别指到bin或者conf子目录,避免启动脚本找不到正确的配置文件路径。
补充:ZooKeeper 3.7.0 本身可以正常兼容OpenJDK 16.0.1,完成上述配置修正后,直接执行
zkServer.cmd start就能正常启动,不需要额外调整JVM参数。
内容的提问来源于stack exchange,提问作者Bilal Can
相关产品推荐
相关产品推荐

