一、ps - 查看进程
ps 是最常用的进程查看命令,对于 Java 应用来说尤其重要。
常用场景
查看 Java 进程:
# 查看所有 Java 进程
ps aux | grep java
# 或使用 pgrep(更简洁)
pgrep -l java
# 查看 Tomcat 进程
ps aux | grep tomcat
# 查看指定端口的进程
ps aux | grep 8080查看进程详细信息:
# 查看指定 PID 的进程
ps -fp 1234
# 查看进程树(查看父子关系)
ps axjf | grep java
# 按内存使用排序(找内存泄漏)
ps aux --sort=-%mem | grep java | head -n 5
# 按 CPU 使用排序(找 CPU 占用高)
ps aux --sort=-%cpu | grep java | head -n 5
提示:生产环境的 Java 应用通常以 jar 包或 Tomcat 方式运行,用 ps 找进程时注意应用名称。
二、top/htop - 系统监控
top 和 htop 是实时监控系统资源的重要工具,排查性能问题时必备。
top 基本使用
# 启动 top
top
# 只查看指定进程
top -p 1234
# 按 CPU 排序(按 P)
# 按内存排序(按 M)
# 退出(按 q)htop 推荐
htop 界面更友好,支持鼠标操作。
# 安装 htop
# Ubuntu/Debian
sudo apt-get install htop
# CentOS/RHEL
sudo yum install htop
# 启动
htop
# F3 搜索进程(输入 java)
# F9 杀死进程
# F10 退出Java 应用排查场景:
- CPU 占用高:找到 Java 进程,看是哪个线程占用高
- 内存泄漏:看 RES/VIRT 列,持续增长可能有问题
- 线程数过多:查看 Java 进程的线程数是否异常
三、netstat/ss - 网络排查
netstat 和 ss 用于查看网络连接和端口占用,排查端口冲突时很有用。
netstat 使用
# 查看所有监听端口
sudo netstat -tlnp
# 查看 8080 端口被谁占用
sudo netstat -tlnp | grep 8080
# 查看指定进程的网络连接
sudo netstat -anp | grep 1234
# 统计 TCP 连接数
sudo netstat -an | grep ESTABLISHED | wc -lss 推荐(更快)
# 查看监听端口
sudo ss -tlnp
# 查看端口占用
sudo ss -tlnp | grep 8080
# 查看进程打开的 socket
sudo ss -p | grep 1234常见问题场景:
- 启动 Spring Boot 报错 "端口已被占用"
- 查看 Tomcat 默认 8080 端口是否被占用
- 查看数据库连接池是否达到上限
四、tail - 查看日志
tail 是 Java 工程师使用频率最高的命令之一,实时查看日志必不可少。
常用用法
# 查看文件最后 100 行
tail -n 100 application.log
# 实时跟踪日志(最常用)
tail -f application.log
# 同时查看多个日志文件
tail -f application.log | grep ERROR
# 实时查看并高亮错误
tail -f application.log | grep --color=auto -E "ERROR|WARN"
# 查看日志最后 N 行并持续监控
tail -n 100 -f application.log多日志文件监控
# 监控多个日志
tail -f application.log system.log
# 或使用 multitail(支持多窗口)
# 安装
sudo apt-get install multitail
# 使用
multitail application.log system.log
注意:生产环境日志量很大,建议配合 grep 过滤,否则终端会刷爆。
五、grep - 搜索内容
grep 用于在文件中搜索文本,分析日志时必不可少。
常用场景
# 搜索错误日志
grep ERROR application.log
# 忽略大小写搜索
grep -i error application.log
# 显示行号
grep -n ERROR application.log
# 查看匹配行的前后 5 行(查看上下文)
grep -C 5 "Exception" application.log
# 只显示匹配行的后 5 行
grep -A 5 "Exception" application.log
# 统计出现次数
grep -c "ERROR" application.log
# 递归搜索所有日志文件
grep -r "Exception" /var/log/apps/
# 反向匹配(不包含某内容)
grep -v "DEBUG" application.log组合使用
# 实时查看错误日志
tail -f application.log | grep ERROR
# 查看最近 1000 行的异常
tail -n 1000 application.log | grep -A 5 "Exception"
# 统计各类型日志数量
grep -E "ERROR|WARN|INFO|DEBUG" application.log | sort | uniq -c六、kill - 管理进程
kill 用于结束进程,重启 Java 应用时经常用到。
常用用法
# 正常结束进程
kill 1234
# 强制结束进程(强制关闭)
kill -9 1234
# 结束多个进程
kill -9 1234 5678
# 结束所有 java 进程(谨慎使用)
sudo killall java
# 结束指定名称的进程
pkill -f tomcat
# 根据 PID 精确结束
kill -TERM 1234Java 应用重启流程:
# 1. 找到 Java 进程 PID
ps aux | grep java
# 2. 正常关闭(等待请求处理完)
kill 1234
# 3. 如果关不掉,强制关闭
kill -9 1234
# 4. 重新启动应用
nohup java -jar app.jar > app.log 2>&1 &
警告:生产环境慎用 kill -9,可能导致数据丢失或事务未回滚。优先使用正常关闭方式。
七、find - 查找文件
find 用于在文件系统中查找文件,找配置文件或日志文件时很有用。
常用场景
# 按名称查找配置文件
find / -name "application.properties"
# 查找目录
find / -type d -name "logs"
# 查找最近 7 天修改的文件
find /var/log -name "*.log" -mtime -7
# 查找大于 100M 的文件
find / -size +100M
# 查找并删除旧日志
find /var/log/apps -name "*.log" -mtime +30 -delete
# 查找空目录
find /path -type d -emptyJava 应用场景
# 查找所有 jar 包
find /opt/app -name "*.jar"
# 查找 Java 进程的 pid 文件
find / -name "*.pid"
# 查找配置文件
find /opt/app -name "application*.yml"
# 查找 core dump 文件
find / -name "core*"八、tar/zip - 解压部署
部署 Java 应用时,经常需要解压压缩包。
tar 常用
# 解压 .tar.gz
tar -xzf apache-tomcat-9.0.50.tar.gz
# 解压到指定目录
tar -xzf app.tar.gz -C /opt/
# 查看 .tar.gz 内容(不解压)
tar -tzf app.tar.gz
# 压缩目录
tar -czf app-backup.tar.gz /opt/app
# 排除某些文件压缩
tar -czf app.tar.gz /opt/app --exclude="*.log"zip 常用
# 解压 zip 文件
unzip app.zip
# 解压到指定目录
unzip app.zip -d /opt/app
# 查看 zip 内容
unzip -l app.zip
# 压缩目录
zip -r app.zip /opt/app部署流程示例:
# 1. 上传部署包
scp app.zip user@server:/tmp/
# 2. 登录服务器解压
cd /opt
unzip /tmp/app.zip
# 3. 备份旧版本
mv app app.bak
# 4. 启动新版本
cd /opt/app/bin
./startup.sh九、curl/wget - 接口测试
curl 和 wget 用于测试接口和下载文件,API 开发必备。
curl 测试接口
# GET 请求
curl http://localhost:8080/api/user/1
# POST JSON 数据
curl -X POST http://localhost:8080/api/user \
-H "Content-Type: application/json" \
-d '{"name":"test","age":18}'
# 只查看响应头(排查问题)
curl -I http://localhost:8080/health
# 查看详细请求过程(调试用)
curl -v http://localhost:8080/api/user/1
# 忽略 SSL 证书(测试环境)
curl -k https://localhost:8443/api/health
# 设置超时时间
curl -m 5 http://localhost:8080/api/health
# 保存响应到文件
curl -o response.json http://localhost:8080/api/user/1wget 下载文件
# 下载 JDK
wget https://download.oracle.com/java/jdk/jdk-11.tar.gz
# 下载 Maven 依赖
wget https://repo1.maven.org/maven2/.../jar-file.jar
# 断点续传(下载大文件)
wget -c https://example.com/large-file.zip
# 后台下载
wget -b https://example.com/file.zip十、df/du - 磁盘排查
磁盘空间不足是 Java 应用的常见问题,需要熟练掌握。
df 查看磁盘使用
# 查看磁盘使用情况
df -h
# 查看指定目录
df -h /var/log
# 查看 inode 使用情况(文件数超限)
df -i
# 查看/tmp 目录(Java 应用临时文件)
df -h /tmpdu 查看目录大小
# 查看当前目录大小
du -sh .
# 查看日志目录大小
du -sh /var/log/apps
# 查看子目录大小(找占用大的)
du -h --max-depth=2 /var/log/apps | sort -rh
# 查找最大的 10 个文件
find /var/log/apps -type f -exec du -h {} + | sort -rh | head -n 10
# 查找所有 .log 文件大小
find /var/log/apps -name "*.log" -exec du -ch {} + | grep total常见问题场景:
- 日志文件占满磁盘
- Java 临时文件堆满 /tmp
- Heap dump 文件过大
- 应用无法写日志(磁盘满)
清理方案:
# 清理 30 天前的日志
find /var/log/apps -name "*.log" -mtime +30 -delete
# 清理 core dump
find / -name "core*" -mtime +7 -delete
# 清理临时文件
rm -rf /tmp/app-cache/*额外推荐:free - 内存监控
Java 应用的内存问题很常见,free 是必备工具。
基本用法
# 查看内存使用
free -h
# 持续监控(每 2 秒)
watch -n 2 free -h
# 以 MB 为单位显示
free -m
# 查看详细内存信息
cat /proc/meminfoJava 应用内存排查:
# 1. 查看系统内存
free -h
# 2. 查看 Java 进程内存占用
ps aux | grep java
# 3. 查看 JVM 堆内存(需要 jmap)
jmap -heap 1234
# 4. 生成 Heap Dump(分析内存泄漏)
jmap -dump:format=b,file=heap.hprof 1234组合使用场景
场景一:应用启动失败
# 1. 查看端口是否被占用
sudo netstat -tlnp | grep 8080
# 2. 查看是否有残留进程
ps aux | grep java
# 3. 查看启动日志
tail -f application.log
# 4. 检查磁盘空间
df -h场景二:应用响应慢
# 1. 查看 CPU 和内存
top
htop
# 2. 查看 Java 进程线程数
ps -eLf | grep java | wc -l
# 3. 查看网络连接
sudo netstat -an | grep ESTABLISHED | wc -l
# 4. 查看错误日志
tail -n 100 application.log | grep ERROR场景三:内存泄漏排查
# 1. 持续监控内存
watch -n 5 free -h
# 2. 查看 Java 进程内存
ps aux | grep java
# 3. 生成 Heap Dump
jmap -dump:format=b,file=heap.hprof 1234
# 4. 查看 GC 日志
tail -f gc.log快速参考
# 查看 Java 进程
ps aux | grep java
# 查看端口占用
sudo netstat -tlnp | grep 8080
# 结束进程
kill -9 1234# 实时查看日志
tail -f application.log
# 查看最近 100 行
tail -n 100 application.log
# 搜索错误
grep ERROR application.log# 系统监控
top
htop
# 查看内存
free -h
# 查看磁盘
df -h# 解压部署包
tar -xzf app.tar.gz
# 查看目录大小
du -sh /opt/app
# 测试接口
curl http://localhost:8080/health实际工作中最重要的是:
- 熟练使用 ps + netstat,快速定位进程和端口问题
- 掌握 tail + grep,高效查看和分析日志
- 了解 top + free,排查性能和内存问题
接下来我会整理JDK自带的常用命令。
相关文章: