Java 中 Linux部署 怎么利用 Shell 脚本自动捕捉应用的内存使用量并在逼近系统硬件死线前自动触发邮件告警

梦瑶姑娘_3615

梦瑶姑娘_3615

2026-07-24

818人浏览

原创

需用shell脚本周期性监控java进程rss内存和jvm堆使用率,结合系统总内存动态设阈值(如rss>60%总内存且堆>75%),超限即邮件告警,并通过crontab每2分钟执行、加锁防重跑、日志同步至/var/log/messages。

java 中 linux部署 怎么利用 shell 脚本自动捕捉应用的内存使用量并在逼近系统硬件死线前自动触发邮件告警

Java 应用在 Linux 上长期运行时,内存泄漏或负载突增可能导致堆内存持续攀升,最终触发 OOM Killer 或服务假死。单纯依赖 JVM 参数(如 -XX:+HeapDumpOnOutOfMemoryError)不够主动——你需要在“逼近硬件极限”前就感知风险。核心思路是:**用 Shell 脚本周期性采集 Java 进程的 RSS 内存 + JVM 堆使用率,结合系统总内存做动态阈值判断,达标即发邮件**。

抓取真实内存占用(RSS + JVM 堆)

Java 进程的 ps aux 中的 %MEM 是相对系统总内存的百分比,但 RSS(Resident Set Size)才是实际物理内存占用,更可靠。同时,JVM 堆使用情况需通过 jstat 获取,避免只看 RSS 忽略元空间、直接内存等。

  • 用 pgrep -f "your-app-name.jar" 精准定位 PID(避免匹配到日志或 grep 自身)
  • RSS 获取:ps -o rss= -p $PID 2>/dev/null | awk '{print int($1/1024)}'(单位 MB)
  • JVM 堆使用率:jstat -gc $PID | tail -1 | awk '{printf "%.1f", ($3+$4)/$2*100}'(Eden + Survivor 占 Young Gen 比例,或用 $3+$4+$10 计算整个堆使用率)
  • 系统总内存:free -m | awk 'NR==2{print $2}'

设定动态告警阈值(不硬编码 80%)

固定百分比(如 “内存 >80%”)在不同机器上意义不同。应按“进程 RSS 占系统总内存比例”+“JVM 堆使用率”双维度判断,并留安全余量:

Linux Distros
Linux Distros

Linux发行版游乐场,适用于需要临时Linux沙箱、基于浏览器的Linux虚拟机、一次性终端环境、桌面Linux会话等场景

下载
  • 例如:当 RSS > (系统总内存 × 0.6) 且 JVM 堆使用率 > 75%,说明应用已吃掉系统大部分内存,GC 压力大,风险高
  • 也可加一条兜底规则:RSS > 4000(MB),适用于内存 ≥16GB 的服务器,防止小内存机器误报
  • 阈值写进脚本变量,方便运维按环境调整,不写死在 if 判断里

用 mailx 或 sendmail 发告警邮件(轻量可靠)

Linux 自带 mailx(需安装 mailutils 或 heirloom-mailx)即可发文本邮件,无需额外部署邮件服务:

  • 配置 SMTP(以 Gmail 为例):echo "set smtp=smtp://smtp.gmail.com:587" >> ~/.mailrc,并设置应用专用密码
  • 发送命令示例:echo "警告:Java 进程 $PID RSS=${rss_mb}MB,堆使用率 ${heap_pct}%,已超阈值" | mailx -s "[ALERT] Java 内存异常" admin@example.com
  • 邮件内容务必包含时间戳、PID、RSS、堆使用率、服务器 hostname,方便快速定位

用 crontab 实现每 2 分钟自动巡检

高频检测(如 30 秒)易造成资源扰动;太低频(如 10 分钟)可能错过峰值。2 分钟是平衡点:

  • 编辑定时任务:crontab -e
  • 添加行:*/2 * * * * /path/to/check_java_mem.sh > /dev/null 2>&1
  • 脚本开头加锁(if [ -f /tmp/java_mem_check.lock ]; then exit; else touch /tmp/java_mem_check.lock; trap 'rm -f /tmp/java_mem_check.lock' EXIT;),防重复执行
  • 每次执行完清理临时状态,避免锁残留

不复杂但容易忽略:告警后别只等邮件,建议脚本里加一句 logger "JAVA MEM ALERT: PID=$PID RSS=${rss_mb}MB HEAP=${heap_pct}%",把记录同步写入 /var/log/messages,和日志系统联动更稳。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10177

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7322

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6432

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2689

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20011

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习