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 就再也拖不死你的服务器了。


相关推荐
sulikey5 分钟前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器
池央25 分钟前
NAS里的大文件怎么快速传?用Copyparty搭建轻量文件服务器
运维·服务器·cpolar
金海境科技26 分钟前
【服务器数据恢复】H3C CAS虚拟化平台HP存储qcow2文件损坏快照丢失数据恢复案例
服务器·数据库·经验分享
发量惊人的中年网工1 小时前
AI服务器托管怎么选机房?GPU集群对机柜、电力和网络的硬要求
服务器·网络·人工智能
玖玥拾2 小时前
Unity 3D 笔记(十五)Unity/C# Socket 网络笔记4
服务器·网络·unity·c#
羑悻的小杀马特3 小时前
把随身WiFi改成网盘聚合器:中兴F50挂载本地存储+夸克网盘实战
运维·服务器·人工智能·网盘·openlist
吳所畏惧14 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈14 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
维天说15 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zhang~Ling15 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器