Ubuntu中Java进程管理指南
在管理Java进程前,需先定位目标进程的PID(进程ID),常用命令如下:
ps -ef | grep java,列出所有包含“java”的进程,输出中第二列为PID;pgrep -af java,直接显示Java进程的PID及完整命令;jps(JDK自带),仅列出当前用户启动的Java进程及主类名;jps -v可显示详细参数。获取进程运行详情及资源占用,可使用以下工具:
top命令(按Shift+M按内存排序,Shift+P按CPU排序),或htop(更友好的交互界面,需sudo apt install htop安装);jstat -gc <PID> 1000(每秒刷新堆内存、垃圾回收情况)、jstack <PID> > thread_dump.txt(导出线程栈信息,用于诊断死锁)、jmap -dump:format=b,file=heapdump.hprof <PID>(生成堆转储快照,分析内存泄漏)。根据场景选择合适方式终止进程,优先使用温和信号:
kill -SIGTERM <PID>,发送SIGTERM信号,允许进程完成清理(如关闭数据库连接、保存数据);kill -9 <PID>(SIGKILL信号),立即终止进程但不保证资源释放;ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9)。若Java应用需随系统启动/停止,建议配置为systemd服务:
/etc/systemd/system/下新建.service文件(如my-java-app.service),内容示例:[Unit]
Description=My Java Application
After=network.target
[Service]
ExecStart=/usr/bin/java -jar /path/to/your-app.jar
Restart=always # 崩溃后自动重启
User=ubuntu # 运行用户
Group=ubuntu # 运行组
Environment="JAVA_OPTS=-Xms512m -Xmx1024m" # JVM参数
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload:重新加载服务配置;sudo systemctl start my-java-app:启动服务;sudo systemctl stop my-java-app:停止服务;sudo systemctl status my-java-app:查看服务状态;sudo systemctl enable my-java-app:设置开机自启。持续监控进程状态,及时发现性能瓶颈:
top/htop(实时资源占用)、jstat -gcutil <PID> 5000 10(每5秒刷新一次GC情况,共10次)、jconsole(图形化监控JVM内存、线程、类加载);VisualVM(集成jconsole、jstack等功能,支持远程监控)、Prometheus+Grafana(构建可视化监控面板,采集JMX指标)。有效管理Java应用日志,便于故障排查:
logrotate工具(Ubuntu自带),创建配置文件/etc/logrotate.d/my-java-app,内容示例:/path/to/your/java/app/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
missingok # 文件不存在不报错
notifempty # 日志为空不轮转
create 640 root adm # 新日志权限
}
ELK Stack(Elasticsearch+Logstash+Kibana)收集、存储、可视化日志;或journald(systemd日志服务),通过journalctl -u my-java-app查看应用日志。