Java应用在Ubuntu上的监控方法
通过Ubuntu自带的系统命令,快速查看Java应用的进程状态和资源占用情况:
ps命令:列出所有Java进程,可通过ps -ef | grep java筛选,或ps -ef | grep [j]ava避免自身进程干扰。top/htop命令:实时监控系统资源使用情况,top中按Shift+M按内存排序,htop(需安装:sudo apt install htop)提供更直观的界面。jtop命令:专为Java应用设计的实时监控工具,安装后(wget https://github.com/kwhat/jtop/releases/download/v0.7.3/jtop-0.7.3.jar && chmod +x jtop-0.7.3.jar && sudo mv jtop-0.7.3.jar /usr/local/bin/jtop.jar),通过jtop查看整体Java进程状态,或jtop -p <PID>监控指定进程。JDK提供了一系列命令行工具,覆盖进程管理、内存分析、线程诊断等场景:
jps(Java Process Status):列出当前用户的Java进程及其PID,用法:jps(显示PID和主类名),jps -v(显示详细启动参数)。jstat(JVM Statistics Monitoring Tool):实时监控JVM内存、垃圾回收(GC)、类加载等指标,例如jstat -gcutil <PID> 5000 10(每5秒刷新一次,共10次,显示堆内存各区域使用率及GC次数)。jstack(Java Stack Trace):生成Java线程的栈跟踪信息,用于诊断死锁、线程阻塞等问题,用法:jstack <PID> > thread_dump.txt(将输出保存到文件便于分析)。jmap(Java Memory Map):生成Java堆转储快照(Heap Dump),用于分析内存泄漏,用法:jmap -dump:format=b,file=heapdump.hprof <PID>(生成二进制堆转储文件)。jconsole(Java Monitoring Console):图形化工具,监控JVM内存(堆、方法区)、线程、类加载、GC等情况,启动方式:jconsole(选择目标Java进程即可)。jvisualvm(Java VisualVM):功能更强大的图形化工具,集成了jps、jstat、jstack等功能,支持生成堆转储、线程分析、性能剖析,启动方式:jvisualvm(需确保JAVA_HOME/bin在PATH中)。针对生产环境的高可用需求,推荐使用以下开源/商业工具:
JMX Exporter(Java代理)采集Java应用的JVM指标(如内存、GC、线程数),配置Prometheus抓取目标(prometheus.yml中添加- targets: ['<Ubuntu_IP>:9090'])。若Java应用为Spring Boot项目,可通过以下方式增强监控能力:
org.springframework.boot:spring-boot-starter-actuator),配置management.endpoints.web.exposure.include=*(开启所有端点),访问http://<Ubuntu_IP>:8080/actuator/health查看健康状态,http://<Ubuntu_IP>:8080/actuator/metrics查看所有指标。micrometer-registry-prometheus依赖,Actuator会自动暴露Prometheus格式的指标端点(/actuator/prometheus)。通过Shell脚本定期检查Java应用状态,实现自动报警和重启:
monitor.sh):#!/bin/bash
PID=$(pgrep -f "java -jar /path/to/your/app.jar")
if [ -z "$PID" ]; then
echo "$(date): Java应用未运行,正在重启..." >> /var/log/java_monitor.log
nohup java -jar /path/to/your/app.jar > /dev/null 2>&1 &
else
CPU_USAGE=$(top -bn1 -p $PID | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
echo "$(date): CPU使用率过高(${CPU_USAGE}%),发送报警..." >> /var/log/java_monitor.log
# 发送邮件报警(需配置mailutils)
echo "Java应用CPU使用率过高:${CPU_USAGE}%" | mail -s "CPU报警" your_email@example.com
fi
fi
crontab -e添加定时任务,每5分钟执行一次脚本:*/5 * * * * /bin/bash /path/to/monitor.sh。