lee@lee-virtual-machine:/etc/systemd/system$ sudo -u cassandra /opt/apache-cassandra-3.11.17/bin/cassandra -f expr: 语法错误:未预期的参数 “2” expr: 语法错误:未预期的参数 “2” /opt/apache-cassandra-3.11.17/bin/../conf/cassandra-env.sh: 第 59 行: [: :需要整数表达式 /opt/apache-cassandra-3.11.17/bin/../conf/cassandra-env.sh: 第 63 行: [: :需要整数表达式 /opt/apache-cassandra-3.11.17/bin/../conf/cassandra-env.sh: 第 67 行: [: :需要整数表达式 expr: 语法错误:未预期的参数 “4” /opt/apache-cassandra-3.11.17/bin/../conf/cassandra-env.sh: 第 81 行: [: :需要整数表达式 Invalid initial heap size: -XmsM Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
时间: 2025-09-03 12:21:45 AIGC 浏览: 21
根据错误日志,问题已明确为 **JVM内存配置错误**。Cassandra的启动脚本`cassandra-env.sh`在解析内存参数时失败,导致`-Xms`(初始堆大小)和`-Xmx`(最大堆大小)未正确设置。以下是详细解决方案:
---
### 关键问题分析:
1. **错误根源**
- 日志显示`Invalid initial heap size: -XmsM`,表明`cassandra-env.sh`脚本未能正确生成JVM内存参数(如`-Xms2G`)。
- 脚本中的`expr`命令和`[`条件判断失败,可能是由于:
- 系统环境变量(如`MAX_HEAP_SIZE`、`HEAP_NEWSIZE`)配置异常。
- 脚本语法与当前Shell环境不兼容(如`dash`而非`bash`)。
2. **常见原因**
- 用户手动修改过`cassandra-env.sh`但格式错误。
- 系统默认Shell不是`bash`(如Ubuntu 20.04+默认使用`dash`)。
---
### 解决方案:
#### 1. 修复`cassandra-env.sh`脚本
编辑文件`/opt/apache-cassandra-3.11.17/conf/cassandra-env.sh`,检查以下关键部分:
```bash
# 确保内存计算逻辑正确(示例为默认配置)
if [ "x$MAX_HEAP_SIZE" = "x" ]; then
# 自动计算最大堆大小(建议为系统内存的1/4)
MAX_HEAP_SIZE="4G" # 根据服务器内存调整
fi
if [ "x$HEAP_NEWSIZE" = "x" ]; then
# 年轻代大小(建议为最大堆的1/4)
HEAP_NEWSIZE="1G"
fi
# 确保JVM参数格式正确
JVM_OPTS="$JVM_OPTS -Xms${MAX_HEAP_SIZE}"
JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}"
JVM_OPTS="$JVM_OPTS -Xmn${HEAP_NEWSIZE}"
```
**注意**:直接赋值(如`MAX_HEAP_SIZE="4G"`)比动态计算更可靠。
#### 2. 强制使用`bash`执行脚本
在`cassandra.service`中指定Shell解释器:
```ini
[Service]
...
ExecStart=/bin/bash -c '/opt/apache-cassandra-3.11.17/bin/cassandra -f'
```
或临时切换默认Shell:
```bash
sudo dpkg-reconfigure dash # 选择“No”以禁用dash
```
#### 3. 手动指定JVM参数
如果脚本修复后仍失败,直接在启动命令中硬编码参数:
```bash
sudo -u cassandra JVM_OPTS="-Xms2G -Xmx2G -Xmn1G" /opt/apache-cassandra-3.11.17/bin/cassandra -f
```
#### 4. 检查系统内存限制
确保系统允许分配足够的内存:
```bash
free -h # 查看可用内存
ulimit -a # 检查用户限制
```
若需调整,在`/etc/security/limits.conf`中添加:
```
cassandra soft memlock unlimited
cassandra hard memlock unlimited
```
---
### 常见问题扩展:
- **如何根据服务器内存动态设置JVM参数?**
在`cassandra-env.sh`中使用以下逻辑(需`awk`支持):
```bash
TOTAL_MEM=$(free -m | awk '/Mem:/ {print $2}')
MAX_HEAP_SIZE="$((TOTAL_MEM / 4))M"
HEAP_NEWSIZE="$((TOTAL_MEM / 16))M"
```
- **Cassandra启动时提示“Cannot allocate memory”如何解决?**
减少`-Xmx`值或关闭其他占用内存的服务。
- **如何验证JVM参数是否生效?**
启动时添加`-Dcassandra.log_jvm_args=true`,或在日志中搜索`JVM arguments`。
---
阅读全文
相关推荐


















