Ubuntu Java程序崩溃原因分析与排查
一 常见根因概览
二 快速定位步骤
ps -ef | grep java)、是否被 systemd 重启(sudo systemctl status <svc>)。sudo journalctl -u <svc> -b;全局日志:sudo journalctl --since "2025-11-30 00:00:00"。jstack <pid> > jstack.log(多次采样对比)。jstat -gcutil <pid> 1000 10。jmap -dump:format=b,file=heap.hprof <pid>(配合 Eclipse MAT 分析泄漏/大对象)。free -m、df -h、top/htop 观察内存、磁盘、CPU 峰值。java -version、javac -version、ldd <native-lib>(排查本地库依赖)。三 典型症状与对应线索
| 症状 | 优先检查 | 常见线索 | 处理要点 |
|---|---|---|---|
| 进程瞬间消失 | journalctl、/var/log/syslog、dmesg |
“killed by SIGKILL”、abrt 记录 | 降低堆峰值、加内存、检查 OOM;必要时配置 coredump 与 abrt 策略 |
| 生成 hs_err_pid.log | 该文件内容 | “EXCEPTION_ACCESS_VIOLATION”、Problematic frame 指向本地库 | 升级/回退 JDK 与本地库;移除或替换有问题的 JNI/本地依赖 |
| 应用日志无报错但停止 | jstack、线程dump、应用日志级别 |
线程长时间 RUNNABLE/WAITING、无异常栈 | 增加日志级别、定位阻塞/死锁、补充异常保护 |
| OutOfMemoryError | Heap Dump、GC 日志 | Full GC 频繁、老年代占满 | 调整 -Xmx/-Xms、优化对象生命周期、修复泄漏 |
| 磁盘写满导致异常 | df -h、应用日志目录 |
日志/临时文件暴涨 | 清理与轮转日志、扩容磁盘、限流输出 |
四 修复与预防建议
Restart=always,确保异常退出后自动拉起;完善日志与告警。五 最小可用的 systemd 服务示例
[Unit]
Description=Java Service
After=network.target
[Service]
Type=simple
User=appuser
ExecStart=/usr/bin/java -Xms512m -Xmx2g -jar /opt/app/app.jar
Restart=always
StandardOutput=journal
StandardError=journal
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now java-servicesudo journalctl -u java-service -f