关于JVM-你想知道的一切

该系列文章详细探讨了JVM的内存管理,从基本的染色标记算法开始,逐步介绍G1收集器的串行到并行转变,以及最新的低暂停时间垃圾回收器Shenandoah和ZGC的工作原理,深入分析了这些技术如何提升Java应用的性能。
你已经成功完成了以下步骤: ```bash vim /opt/openfire/enterprise/spark/start-spark.sh # ✅ 创建脚本 chmod +x /opt/openfire/enterprise/spark/start-spark.sh # ✅ 添加执行权限 touch /var/log/spark-client.log # ✅ 创建日志文件 chown sparkuser:sparkuser /var/log/spark-client.log # ✅ 授权用户可写 su - sparkuser # ✅ 切换到专用用户 /opt/openfire/enterprise/spark/start-spark.sh # ✅ 执行启动脚本 ``` 但执行后 **没有任何输出、也没有图形界面弹出**,说明脚本虽然运行了,但可能在早期阶段就退出了 —— 很可能是由于环境问题或 `java` 命令不可用。 --- ## 🔍 问题诊断:为什么脚本“静默退出”? 我们来逐步分析原因。 ### ❌ 现象:无报错、无窗口、无日志 你的脚本中设置了日志输出: ```bash echo "$(date): 正在启动 Spark 客户端..." >> $LOG_FILE ``` 但是你没有看到任何内容写入 `/var/log/spark-client.log`,这说明: > 🚫 脚本在 `echo` 之前就已经失败了! 最常见的原因是: ### 🔹 根本原因:`#!/bin/bash` 解释器缺失或被忽略 当你用 `vim` 写脚本时,如果忘记第一行或者格式错误,Linux 就不知道如何运行它。 请检查: ```bash head -n1 /opt/openfire/enterprise/spark/start-spark.sh ``` 你应该看到: ```bash #!/bin/bash ``` 如果不是,请重新编辑并确保它是第一行、且没有空格或 BOM。 --- ## ✅ 第一步:验证脚本是否具有正确的 shebang 运行: ```bash cat -A /opt/openfire/enterprise/spark/start-spark.sh | head -n2 ``` 输出应类似: ```text #!/bin/bash$ APP_DIR="/opt/openfire/enterprise/spark/Spark"$ ``` - `$` 表示行尾; - 如果看到 `^M$`,说明是 Windows 换行符(需用 `dos2unix` 转换); - 如果第一行不是 `#!/bin/bash`,则 shell 会当作普通命令执行,导致静默失败。 🔧 修复方法: ```bash vim /opt/openfire/enterprise/spark/start-spark.sh ``` 确保第一行为: ```bash #!/bin/bash ``` 保存退出。 然后测试是否能被正确解析: ```bash bash -n /opt/openfire/enterprise/spark/start-spark.sh ``` ✅ 无输出表示语法正确。 --- ## ✅ 第二步:手动逐行执行脚本,定位卡点 切换到 `sparkuser`,不要直接运行脚本,而是手动一步步执行: ```bash su - sparkuser ``` 然后依次输入: ```bash export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk export PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin java -version ``` 🎯 预期输出: ```text openjdk version "1.8.0_312" OpenJDK Runtime Environment (build 1.8.0_312-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode) ``` ❌ 如果报错:`java: command not found` → 说明 `JAVA_HOME/bin` 下没有 `java` 可执行文件。 验证一下: ```bash ls -l $JAVA_HOME/bin/java ``` 预期输出: ```text lrwxrwxrwx 1 root root 38 Oct 30 10:00 /usr/lib/jvm/jre-1.8.0-openjdk/bin/java -> /etc/alternatives/jre_1.8.0_openjdk ``` 如果路径不存在,请确认符号链接是否正常: ```bash readlink -f /usr/lib/jvm/jre-1.8.0-openjdk ``` 应该指向实际版本目录,例如: ```text /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64 ``` --- ## ✅ 第三步:添加调试信息到脚本(让其“说话”) 修改脚本开头部分,加入调试模式和错误追踪: ```bash #!/bin/bash set -x # 开启调试:打印每一条执行的命令 exec >> /var/log/spark-client.log 2>&1 # 所有输出自动记录到日志 echo "=== $(date) 开始执行 Spark 启动脚本 ===" APP_DIR="/opt/openfire/enterprise/spark/Spark" LOCK_FILE="/tmp/spark-running.pid" LOG_FILE="/var/log/spark-client.log" export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk export PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 检查 Java 是否可用 if ! command -v java &> /dev/null; then echo "错误:java 命令未找到,请检查 JAVA_HOME=$JAVA_HOME" exit 1 fi echo "Java 版本:$(java -version 2>&1)" if pgrep -f "jivesoftware.launcher.Startup" > /dev/null; then echo "错误:Spark 已在运行" exit 1 fi cd "$APP_DIR" || { echo "无法进入目录 $APP_DIR"; exit 1; } echo "当前目录:$(pwd)" echo "PATH: $PATH" java -jar Spark.jar & SPARK_PID=$! echo "Spark 启动成功,PID=$SPARK_PID" echo $SPARK_PID > "$LOCK_FILE" cleanup() { echo "停止 Spark (PID: $SPARK_PID)" kill $SPARK_PID 2>/dev/null || true rm -f "$LOCK_FILE" } trap cleanup EXIT wait $SPARK_PID ``` 📌 修改后记得再次赋权: ```bash chmod +x /opt/openfire/enterprise/spark/start-spark.sh ``` --- ## ✅ 第四步:运行并查看日志 ```bash su - sparkuser /opt/openfire/enterprise/spark/start-spark.sh ``` 然后打开另一个终端查看日志: ```bash tail -f /var/log/spark-client.log ``` 你会看到详细的执行过程,比如: ```text === Thu Oct 30 11:20:00 CST 2025 开始执行 Spark 启动脚本 === + APP_DIR=/opt/openfire/enterprise/spark/Spark + LOCK_FILE=/tmp/spark-running.pid + export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk + JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk ... + java -version openjdk version "1.8.0_312" ... + cd /opt/openfire/enterprise/spark/Spark + java -jar Spark.jar ``` 🎯 如果一切顺利,Spark 图形界面就会弹出! --- ## ✅ 第五步:确保 GUI 显示正常(X11 权限) 如果你是在远程 SSH 登录,并使用 `start-spark.sh` 启动图形程序,必须启用 X11 转发。 ### 检查 X11 是否可用 ```bash echo $DISPLAY ``` 你应该看到: ```text :0 或 localhost:10.0 ``` 如果没有,说明没有图形环境或未开启转发。 ### 允许访问显示设备(root 下运行一次) ```bash xhost + ``` 输出: ```text access control disabled, clients can connect from any host ``` ⚠️ 这会降低安全性,仅用于测试。 然后再以 `sparkuser` 启动脚本,GUI 应该可以显示。 --- ## ✅ 最终建议:简化调试流程 你可以先手动试运行一次: ```bash su - sparkuser export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk export PATH=$JAVA_HOME/bin:$PATH cd /opt/openfire/enterprise/spark/Spark java -jar Spark.jar ``` ✅ 如果这时能弹出窗口 → 说明环境没问题,问题出在脚本没正确设置环境变量。 --- ### ✅ 总结:常见失败点汇总 | 故障点 | 检查方式 | 修复方法 | |--------|----------|---------| | 缺少 `#!/bin/bash` | `head -1 script.sh` | 添加 shebang | | `java` 找不到 | `which java`, `java -version` | 设置正确 `JAVA_HOME` 和 `PATH` | | 日志无内容 | `tail /var/log/spark-client.log` | 使用 `set -x` 和重定向输出 | | GUI 不显示 | `echo $DISPLAY` | 使用 `xhost +` 并确保本地支持 X11 | | 脚本权限不足 | `ls -l script.sh` | `chmod +x` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值