tomcat 内存太小无法启动工程
上周三凌晨两点,内存同事老张在群里发了条消息:“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语言写代码,让网站或Web应用能跑起来、跑得稳、跑得快。 但这句话展开来,内容可就杂了。我认识一个在电商公司做了五年的PHP工程师,他早上到公司第一件
...[详细]
-
Windows Server 2003 SP2 的补丁包,说白了就是微软在 2007 年扔出来的一个巨型更新合集。它不光是修修补补,还塞进了不少新东西。你要是当年管过服务器,肯定记得那个场景:装完系统
...[详细]
-
打开一个网站,翻到“关于我们”页面,十有八九写着“致力于打造行业领先的一站式解决方案”。读完你也不知道这家公司到底卖什么、帮谁、怎么收费。这种说明写了等于没写。 网站说明的第一句就该把“你是谁、干什么
...[详细]
-
网页设计毕业设计,说白了就是一场和浏览器的谈判。你对着代码敲了三个月,最后它只给你一次机会,在别人按下F5的那三秒钟里决定成败。 我的毕设选题是《旧城记忆——城市更新中的口述史档案》。听起来挺唬人,其
...[详细]
-
防范非法宗教渗透安全ppt 去年秋天,某高校保卫处在一场例行宿舍检查中,从一名大三学生的抽屉里翻出了十几份手抄的“福音单张”。纸张粗糙,内容却极具煽动性——宣称“世界末日将至,只有加入他们的‘小群’才
...[详细]
-
2023年那会儿,我蹲过几次SteamCDK的发放现场。凌晨三点,某个小主播的直播间里,弹幕刷得跟下雨一样,管理员甩出一串代码,五秒内被领完。手慢的人只能在公屏打“求私发”,然后被房管禁言。这就是CD
...[详细]
-
去年有个朋友接了个渗透测试的活儿,客户是本地一家做电商的中型企业。他干了五年安全,技术没得说,结果签合同前被对方法务一句话卡住了:“你们公司有CNITSEC的资质吗?”他当时就愣了。最后这单子被一家技
...[详细]
-
南京的黑社会不是《古惑仔》里那种砍刀开路、堂口分账的江湖。它藏在菜市场的猪肉摊后面,混在拆迁办的签约室里,甚至就蹲在某个派出所值班民警的茶杯底下。我见过最狠的“老大”,是个穿旧夹克、戴金丝眼镜的老头,
...[详细]
-
河南这边做污水反渗透实验装置的厂家不少,但报价差距能拉到一倍以上。上周帮新乡一个客户询了三家,同样产水1吨/小时的设备,郑州某厂报4.2万,洛阳一家给到3.6万,还有个开封的贸易商开口就是6.8万——
...[详细]

永不迷路网址
局域网漏洞扫描工具
网络诈骗最新骗术
贷超app
