Spring Boot 项目调优,JVM 调优,预防触发Linux的OOM-Killer机制

本文介绍了如何针对一个8GB内存的Linux服务器上运行的Spring Boot服务进行内存调优,以防止触发Linux的OOM-Killer机制。以一个RocketMQ消费者服务为例,调整JVM参数,观察内存占用情况,分析Java进程堆栈,探讨进一步优化的可能性。通过减少线程堆栈大小等手段尝试减小内存占用,同时提供了相关参考资料供深入研究。

前言

手上有一个测试服务器,内存是8G,最近开始搭起微服务的软件架构,单个Spring Boot 服务内存占用有点大,比如一个RocketMq的消费者服务(单独运行的服务),启动占用了 500M 内存,导致我后面想运行其他服务,内存不够,触发了 Linux 的 OOM - Killer 机制

Linux杀死了我们的进程,但 nohup.out 没有记录任何东西,我们的linux发生的都在记录/var/log下,通过下面命令查看被杀死进程信息

dmesg | egrep -i -B100 'killed process
在这里插入图片描述

最近内存的确有点吃紧,上面只需要关注第二个 anno-rss 实际占用内存(被Kill前),现在有两个方向一个是不做微服务,第二个是给Spring Boot 项目瘦身√

下面以我们的RocketMQ消费者为例,看看没有优化前直接启动占用多少实际内存

# 启动命令
nohup java -jar /usr/****/jar/consumer-rocketmq/target/consumer-rocketmq-2.0.1.RELEASE.jar &

# 获取进程号23371的pid和启动参数,rss实际占用内存(kB),vsz允许最大内存,
在使用 `nohup java -jar` 部署 JAR 包时,应用可能会因为多种原因出现崩溃或意外退出的情况。以下是几种常见的解决方法: 1. **日志文件过大问题** 默认情况下,`nohup` 会将输出写入 `nohup.out` 文件中,如果未进行管理,该文件可能无限增长并导致磁盘空间耗尽,从而引发程序异常退出。为了避免这一问题,可以将标准输出和错误输出重定向到 `/dev/null`,即不记录任何输出: ```bash nohup java -jar xxxx.jar > /dev/null 2>&1 & ``` 这样可以有效避免因日志文件过大而导致的系统资源耗尽问题[^1]。 2. **内存配置不当** 如果 JVM 的堆内存设置不合理(例如 `-Xms` 和 `-Xmx` 设置过小),可能导致应用在处理大量请求或数据时发生 `OutOfMemoryError`。因此,建议根据实际需求JVM 内存参数,并确保有足够的物理内存可用: ```bash nohup java -jar -Xms512m -Xmx1024m /xxx/yyy/aaa.jar & ``` 此外,还可以通过添加 `-XX:+HeapDumpOnOutOfMemoryError` 参数来生成堆转储文件,以便后续分析内存泄漏的原因[^2]。 3. **临时目录配置** 某些 Java 应用(尤其是基于 Tomcat 的 Spring Boot 应用)会在运行时使用默认的系统临时目录(如 `/tmp`)。如果该目录权限受限或磁盘空间不足,可能导致应用异常退出。为避免此类问题,可以通过 `-Djava.io.tmpdir` 显式指定一个具有足够空间和适当权限的临时目录: ```bash nohup java -Djava.io.tmpdir=/xxx/.../tmp -jar -Xms512m -Xmx512m /xxx/.../xxx.jar --server.tomcat.basedir=/xxx/.../tmp & ``` 同时,`--server.tomcat.basedir` 参数用于指定 Tomcat 的工作目录,防止其使用默认路径导致的问题[^2]。 4. **自动重启机制** 为了提高服务的可用性,可以在脚本中实现自动重启逻辑。例如,编写一个 Shell 脚本来定期检查应用是否仍在运行,并在检测到进程终止后重新启动它: ```bash #!/bin/bash while true; do if ! ps -p <PID> > /dev/null; then echo "Application is not running, restarting..." nohup java -jar -Xms512m -Xmx1024m /path/to/app.jar > /dev/null 2>&1 & fi sleep 60 done ``` 其中 `<PID>` 是应用的进程 ID。此脚本每分钟检查一次应用状态,若发现进程不存在,则自动重启应用[^4]。 5. **健康检查与监控** 使用 `curl` 或其他 HTTP 客户端工具对应用的健康检查接口进行轮询,确保应用始终处于可访问状态。如果检测失败,可以触发重启操作: ```bash #!/bin/bash if ! curl -s -f http://localhost:8080/actuator/health > /dev/null; then echo "Application health check failed, restarting..." pkill -f "java -jar" nohup java -jar -Xms512m -Xmx1024m /path/to/app.jar > /dev/null 2>&1 & fi ``` 上述脚本通过用 `/actuator/health` 接口判断应用是否正常,若失败则杀死当前 Java 进程并重新启动[^5]。 6. **查看日志与试信息** 若应用频繁崩溃但无明显外部表现,应先检查 `nohup.out` 中的日志内容,寻找异常堆栈信息。此外,还可以结合系统日志(如 `/var/log/messages` 或 `dmesg` 输出)查找是否有 OOM Killer 杀死进程的记录: ```bash dmesg | grep -i kill ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值