当前位置:首页 > 娱乐 > tomcat 内存太小无法启动工程

tomcat 内存太小无法启动工程

2026-10-17 05:33:31 [时尚] 来源:力不从心网

上周三凌晨两点,内存同事老张在群里发了条消息:“Tomcat又起不来了,无法日志里就一行 OutOfMemoryError,启动连个堆栈都没打全。工程”配图是内存黑底白字的 catalina.out,满屏的无法 Java heap space。这场景太熟了——项目打包部署到测试环境,启动启动脚本一跑,工程Tomcat 刚加载完 Spring 容器就卡死,内存控制台刷出几十行 GC overhead limit exceeded,无法最后进程直接挂掉。启动老张试过重启、工程换端口、内存清 work 目录,无法没用。启动问题根本不在配置,在内存。

Tomcat 默认的 JVM 堆内存小得可怜。你要是没在 catalina.sh 或 setenv.sh 里显式指定 -Xms 和 -Xmx,Linux 下它可能只拿到 256MB 甚至更少。一个中等规模的 Spring Boot 工程,光加载几十个 Bean、初始化数据源、扫描注解,就能吃掉 300MB 以上。更别说那些带 Lucene 索引、缓存预热、或者启动时跑批量任务的系统。堆一满,Full GC 频繁触发,CPU 飙到 100%,Tomcat 还没 bind 端口就自己先崩了。

先确认是不是真被内存卡住

别急着改参数。先看日志里有没有 “java.lang.OutOfMemoryError: Java heap space” 或者 “GC overhead limit exceeded”。有,基本就是堆不够。再查一下当前 Tomcat 进程实际用的内存:

ps -ef | grep tomcat jstat -gc <pid> 1000 5 

如果 OU(老年代使用量)接近 OC(老年代容量),而且 Full GC 后几乎不下降,那就是堆太小或者有内存泄漏。临时验证很简单:手动启动时加上 -Xmx1024m,看能不能起来。能起来,就说明默认值太小。

改哪里,怎么改

Linux 下别直接改 catalina.sh,升级或重装会被覆盖。在 $CATALINA_BASE/bin 下新建 setenv.sh,写一行:

export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m" 

Windows 对应建 setenv.bat,用 set JAVA_OPTS=...。注意 -Xms 和 -Xmx 设成一样,避免堆动态伸缩带来的额外 GC 开销。Metaspace 在 Java 8 以后也要留意,加载类多的时候默认无上限,但物理内存有限,设个 MaxMetaspaceSize 防止它把机器吃光。

有个坑:如果你用 systemd 管理 Tomcat 服务,setenv.sh 可能不生效。得在 service 文件里加 Environment="JAVA_OPTS=-Xmx1024m",或者直接在 ExecStart 里写全路径 java 命令带上参数。

别只盯着堆

有时候堆够大还是起不来。检查一下线程栈:-Xss 默认 1M,如果应用创建了几百个线程,光栈就占几百兆。还有直接内存,NIO 框架或者 Netty 会用 -XX:MaxDirectMemorySize,不设的话默认等于堆大小,物理内存不够照样 OOM。另外,容器环境里要小心——Docker 的 memory limit 如果设了 1G,而你给 JVM 堆设了 1G,剩下给 Metaspace、线程栈、直接内存的空间就没了,Tomcat 可能被内核 OOM Killer 干掉,日志里连 Java 异常都看不到。

老张那次最后查出来是启动时加载了一个全文检索的索引,默认堆 256M 根本装不下。改成 1G 后秒起。但我也见过有人把 -Xmx 设成 8G,结果机器只有 4G 物理内存,Tomcat 启动时疯狂 swap,比蜗牛还慢。内存参数不是越大越好,得看机器实际有多少,留 20% 给操作系统和其他进程。

下次 Tomcat 起不来,先翻 catalina.out 找 OOM 关键字,再 jstat 看一眼 GC 情况,然后去 setenv.sh 里加参数。别上来就重装 Tomcat,那玩意儿没问题,是你没给它吃饱。

(责任编辑:休闲)

推荐文章
  • 网站购买平台

    网站购买平台 我上个月在一个叫“某某优选”的网站买了个蓝牙耳机,价格比京东便宜了四十块。到货那天拆开包装,耳机边缘的塑料毛刺扎了我一下。我拍照、申请售后,客服回复倒是快,但翻来覆去就一句话:亲,这个不影响使用哦。三 ...[详细]
  • php工程师是干什么的

    php工程师是干什么的 PHP工程师每天干的事情,说白了就一句话:用PHP语言写代码,让网站或Web应用能跑起来、跑得稳、跑得快。 但这句话展开来,内容可就杂了。我认识一个在电商公司做了五年的PHP工程师,他早上到公司第一件 ...[详细]
  • windowsserver2003sp2补丁包

    windowsserver2003sp2补丁包 Windows Server 2003 SP2 的补丁包,说白了就是微软在 2007 年扔出来的一个巨型更新合集。它不光是修修补补,还塞进了不少新东西。你要是当年管过服务器,肯定记得那个场景:装完系统 ...[详细]
  • 网站说明怎么写

    网站说明怎么写 打开一个网站,翻到“关于我们”页面,十有八九写着“致力于打造行业领先的一站式解决方案”。读完你也不知道这家公司到底卖什么、帮谁、怎么收费。这种说明写了等于没写。 网站说明的第一句就该把“你是谁、干什么 ...[详细]
  • 网站设计毕业设计

    网站设计毕业设计 网页设计毕业设计,说白了就是一场和浏览器的谈判。你对着代码敲了三个月,最后它只给你一次机会,在别人按下F5的那三秒钟里决定成败。 我的毕设选题是《旧城记忆——城市更新中的口述史档案》。听起来挺唬人,其 ...[详细]
  • 防范非法宗教教渗透安全ppt

    防范非法宗教教渗透安全ppt 防范非法宗教渗透安全ppt 去年秋天,某高校保卫处在一场例行宿舍检查中,从一名大三学生的抽屉里翻出了十几份手抄的“福音单张”。纸张粗糙,内容却极具煽动性——宣称“世界末日将至,只有加入他们的‘小群’才 ...[详细]
  • steamcdk兑换码大全2023

    steamcdk兑换码大全2023 2023年那会儿,我蹲过几次SteamCDK的发放现场。凌晨三点,某个小主播的直播间里,弹幕刷得跟下雨一样,管理员甩出一串代码,五秒内被领完。手慢的人只能在公屏打“求私发”,然后被房管禁言。这就是CD ...[详细]
  • 渗透测试需要什么资质

    渗透测试需要什么资质 去年有个朋友接了个渗透测试的活儿,客户是本地一家做电商的中型企业。他干了五年安全,技术没得说,结果签合同前被对方法务一句话卡住了:“你们公司有CNITSEC的资质吗?”他当时就愣了。最后这单子被一家技 ...[详细]
  • 南京黑社会

    南京黑社会 南京的黑社会不是《古惑仔》里那种砍刀开路、堂口分账的江湖。它藏在菜市场的猪肉摊后面,混在拆迁办的签约室里,甚至就蹲在某个派出所值班民警的茶杯底下。我见过最狠的“老大”,是个穿旧夹克、戴金丝眼镜的老头, ...[详细]
  • 河南污水反渗透实验装置报价

    河南污水反渗透实验装置报价 河南这边做污水反渗透实验装置的厂家不少,但报价差距能拉到一倍以上。上周帮新乡一个客户询了三家,同样产水1吨/小时的设备,郑州某厂报4.2万,洛阳一家给到3.6万,还有个开封的贸易商开口就是6.8万—— ...[详细]
热点阅读