TOMCAT跑死服务器,怎么限制TOMCAT使用资源

🚨 服务器跑着跑着就死机了?

一次把 Tomcat "总内存"限制住,彻底避免把主机撑爆(新手教程)


一、文章缘起:

服务器总是运行着运行着,就被 Tomcat 撑死了

事情一开始,其实很普通。

一台 16G 内存 的服务器,

只跑一个 Tomcat,看起来完全够用。

Tomcat 启动正常、访问也不慢,

一切都显得很"健康"。

可问题是,只要运行一段时间:

  • SSH 开始变慢
  • 服务响应越来越卡
  • 最后整台机器直接 死机 / OOM / 被云平台重启

最折磨人的是:

重启之后还能继续跑,
但过几个小时或几天,又会再死一次。


二、新手最容易掉进的误区:

我明明已经限制了 JVM 内存

当时我的配置是这样的:

bash 复制代码
-Xmx8g

服务器 16G,

Tomcat 最多 8G,

怎么看都很合理。

但现实是:服务器还是被拖死了。


三、后来才明白的真相(关键)

-Xmx 只限制 JVM 堆内存,
并不等于 Tomcat 的"总内存"。

Tomcat 在运行过程中,还会不断消耗:

  • Metaspace(类加载、反射)
  • Direct Memory(NIO / 网络 IO)
  • 线程栈(线程越多越吃)
  • 本地库 / Native 内存

这些内存:

  • 不受 -Xmx 控制
  • 会慢慢增长
  • 最终把系统内存吃光

👉 所以,只靠 JVM 参数,根本拦不住 Tomcat 撑爆服务器。


四、真正正确的思路(一句话就够)

JVM 负责"怎么用内存",
操作系统负责"最多能用多少内存"。

要避免服务器被拖死,
必须从操作系统层面限制 Tomcat 进程的"总内存"。


五、最稳、最简单的解决方案(新手必学)

适用环境:

  • Linux(Ubuntu / CentOS / Rocky / Alma)
  • Tomcat 使用 systemd 启动

先确认:

bash 复制代码
systemctl status tomcat

只要能看到 active (running),就可以继续。


六、核心实操:3 步限制 Tomcat 总内存

✅ Step 1:给 Tomcat 加 OS 级内存上限

bash 复制代码
sudo systemctl edit tomcat

粘贴下面内容:

ini 复制代码
[Service]
MemoryAccounting=true
MemoryMax=10G

含义很简单:

  • Tomcat 这个进程,最多只能使用 10G 内存
  • 超过就直接被系统拦住

✅ Step 2:让配置生效

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart tomcat

如果之前启动失败过:

bash 复制代码
sudo systemctl reset-failed tomcat
sudo systemctl start tomcat

✅ Step 3:确认限制真的生效(一定要做)

bash 复制代码
systemctl show tomcat -p MemoryMax

看到类似输出:

复制代码
MemoryMax=10737418240

说明 OS 级别内存限制已经生效 ✅

Tomcat 再也不可能把服务器撑爆。


七、新手推荐的 JVM 配置(稳妥版)

不追求极限性能,只求长期稳定

bash 复制代码
-Xms4g -Xmx6g

可选加上:

bash 复制代码
-XX:MaxMetaspaceSize=512m
-XX:MaxDirectMemorySize=512m

原则只有一个:

JVM 配得保守一点,
操作系统来兜底。


八、新手最容易踩的坑(务必避开)

❌ 只配 -Xmx,不做 OS 限制

❌ 用 nohup / screen 启 Tomcat(systemd 管不到)

❌ 改了配置却忘记重启

❌ 线程数太大,线程栈把内存吃光

❌ 以为"机器内存大就没问题"


九、附:完整 tomcat.service 示例(可直接用)

下面是一个 完整、可复制 的 tomcat.service

适合新手,生产环境可直接使用。

适用说明

  • Tomcat:/opt/tomcat
  • JDK:/opt/jdk
  • 限制 Tomcat 总内存:10G

/etc/systemd/system/tomcat.service

ini 复制代码
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking

# ===== 新手可先用 root,熟悉后再换 tomcat 用户 =====
User=root
Group=root

# ===== Java 环境 =====
Environment="JAVA_HOME=/opt/jdk"
Environment="JRE_HOME=/opt/jdk"

# ===== Tomcat 路径 =====
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"

# ===== JVM 参数(示例)=====
Environment="JAVA_OPTS=-Xms4g -Xmx6g -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=512m"

# ===== OS 级别总内存限制(关键)=====
MemoryAccounting=true
MemoryHigh=9G
MemoryMax=10G

# ===== 启动 / 停止 =====
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

# ===== 异常重启策略 =====
Restart=on-failure
RestartSec=5
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

生效:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl restart tomcat

十、最后一句话(送给新手)

不是 Tomcat 有问题,
而是你从没告诉操作系统:
"它最多只能用多少内存。"

只要记住并用上这两行:

ini 复制代码
MemoryAccounting=true
MemoryMax=10G

👉 Tomcat 就再也拖不死你的服务器了。


相关推荐
进击的荆棘18 分钟前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
天诰12 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
陈希12314 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡14 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾15 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
讯捷蓝达20 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
数字新视界1 天前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng1 天前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮1 天前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频