news 2026/4/3 3:03:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TOMCAT跑死服务器,怎么限制TOMCAT使用资源

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

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


一、文章缘起:

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

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

一台16G 内存的服务器,
只跑一个 Tomcat,看起来完全够用。

Tomcat 启动正常、访问也不慢,
一切都显得很“健康”。

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

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

最折磨人的是:

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


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

我明明已经限制了 JVM 内存

当时我的配置是这样的:

-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启动

先确认:

systemctl status tomcat

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


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

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

sudosystemctl edit tomcat

粘贴下面内容:

[Service] MemoryAccounting=true MemoryMax=10G

含义很简单:

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

✅ Step 2:让配置生效

sudosystemctl daemon-reloadsudosystemctl restart tomcat

如果之前启动失败过:

sudosystemctl reset-failed tomcatsudosystemctl start tomcat

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

systemctl show tomcat -p MemoryMax

看到类似输出:

MemoryMax=10737418240

说明OS 级别内存限制已经生效
Tomcat 再也不可能把服务器撑爆。


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

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

-Xms4g -Xmx6g

可选加上:

-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

[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

生效:

sudosystemctl daemon-reloadsudosystemctlenabletomcatsudosystemctl restart tomcat

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

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

只要记住并用上这两行:

MemoryAccounting=true MemoryMax=10G

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


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 17:32:49

使用PyTorch-CUDA-v2.6镜像跑通第一个CNN示例代码

使用PyTorch-CUDA-v2.6镜像跑通第一个CNN示例代码 在深度学习项目中,最让人头疼的往往不是模型设计本身,而是环境配置——明明代码写得没问题,却因为CUDA版本不匹配、cuDNN缺失或PyTorch编译错误导致训练无法启动。尤其对刚入门的新手来说&am…

作者头像 李华
网站建设 2026/4/2 2:57:53

为什么 80% 的大模型备案,问题根本不在材料,而在第一步就走错了

很多企业在推进大模型备案时,都会经历一个非常相似的过程:材料反复被打回、审核周期一拖再拖、产品上线时间不断往后推。直到这个时候,才开始怀疑:是不是哪里理解错了。但从实际备案经验来看,大模型备案失败&#xff0…

作者头像 李华
网站建设 2026/3/26 19:15:57

如何将本地数据挂载到PyTorch-CUDA-v2.6镜像中进行训练

如何将本地数据挂载到 PyTorch-CUDA-v2.6 镜像中进行训练 在深度学习项目中,一个常见的挑战是:如何快速搭建稳定、可复现的训练环境,同时又能高效访问本地存储的大规模数据集?尤其是在团队协作或跨平台迁移时,“在我机…

作者头像 李华
网站建设 2026/3/31 23:07:00

PyTorch-CUDA-v2.6镜像实战:Jupyter Notebook快速上手教程

PyTorch-CUDA-v2.6镜像实战:Jupyter Notebook快速上手教程 在深度学习项目中,最让人头疼的往往不是模型设计本身,而是环境配置——“在我机器上能跑”成了团队协作中的黑色幽默。你有没有经历过这样的场景?刚克隆一个代码仓库&am…

作者头像 李华
网站建设 2026/3/31 3:56:33

PyTorch-CUDA-v2.6镜像运行ResNet50图像分类实战演示

PyTorch-CUDA-v2.6镜像运行ResNet50图像分类实战演示 在现代AI开发中,一个常见的痛点是:明明代码写得没问题,模型结构也正确,可一执行 torch.cuda.is_available() 却返回 False —— GPU没用上。于是开始排查驱动版本、CUDA兼容性…

作者头像 李华
网站建设 2026/4/1 23:32:38

React Native与原生模块通信机制深度剖析

React Native 与原生通信:从桥接到 TurboModules 的实战演进你有没有遇到过这样的场景?在 React Native 应用里调一个原生方法,比如读取传感器数据或启动蓝牙扫描,结果界面“卡”了一下?或者你在做实时手势反馈时&…

作者头像 李华