您现在的位置是:焦点 >>正文
tomcat 内存太小无法启动工程
焦点93733人已围观
简介上周三凌晨两点,同事老张在群里发了条消息:“Tomcat又起不来了,日志里就一行 OutOfMemoryError,连个堆栈都没打全。”配图是黑底白字的 catalina.out,满屏的 Java h ...
上周三凌晨两点,内存同事老张在群里发了条消息:“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,那玩意儿没问题,是你没给它吃饱。
Tags:
相关文章
名词解释电子商务案例
焦点2018年双十一,一家叫“完美日记”的国货彩妆品牌,单日销售额破亿。这个数字在美妆行业不算惊天动地,真正让同行坐不住的是它的打法——没有线下专柜,没有传统广告,全靠小红书和微信社群里几千个“素人”种草 ...
【焦点】
阅读更多中国移动web
焦点中国移动的web端体验,说实话,一直是个被低估的存在。我指的是那个藏在10086.cn背后的庞大系统,不是那个偶尔弹出来让你交话费的简洁页面,而是你登录网上营业厅、查详单、办宽带时真正面对的那套交互逻 ...
【焦点】
阅读更多中国黑帽
焦点中国黑客圈子里,黑帽和白帽的界限比外人想象的模糊得多。2016年,一个叫“飓风”的团伙被端掉时,警方发现他们不仅攻击政府网站,还私下给几家小公司做安全测试——收费只有正规安全厂商的三分之一。这不是个例 ...
【焦点】
阅读更多