阅读量:0
1. 诊断内存溢出根源
首先需要确认Tomcat内存溢出的具体类型(如堆内存、元空间、线程数等),这是解决问题的关键。
- 查看日志:检查Tomcat的
catalina.out、localhost.log等日志文件,搜索OutOfMemoryError相关错误(如java.lang.OutOfMemoryError: Java heap space、java.lang.OutOfMemoryError: Metaspace、java.lang.OutOfMemoryError: unable to create new native thread),明确溢出类型。 - 生成堆转储:若为堆内存溢出,可通过
jmap命令生成堆转储文件(如jmap -dump:format=b,file=/tmp/heap.hprof),再用Eclipse MAT、VisualVM等工具分析内存中占用最大的对象(如未释放的集合、缓存、ThreadLocal等),定位内存泄漏点。
2. 调整JVM内存参数(针对堆/元空间溢出)
Linux下Tomcat的JVM参数通过bin/catalina.sh文件配置(建议在cygwin=false之上添加),根据溢出类型调整对应参数:
- 堆内存溢出(Java heap space):增加初始堆(
-Xms)和最大堆(-Xmx)大小(建议设为物理内存的1/4~1/2,且两者值相等,避免频繁GC)。例如:其中JAVA_OPTS="-server -Xms2g -Xmx4g -Xss256k"-server启用服务器模式(提升性能),-Xss设置线程栈大小(默认1MB,可适当减小至256K~512K以节省内存)。 - 元空间溢出(Metaspace):Java 8及以上版本需调整元空间大小(替代原永久代),添加
-XX:MaxMetaspaceSize参数(如-XX:MaxMetaspaceSize=512m),避免元空间无限增长。 - 永久代溢出(PermGen space,Java 8以下):调整永久代初始大小(
-XX:PermSize)和最大大小(-XX:MaxPermSize),例如:注意:Java 8及以上版本无需配置此参数。JAVA_OPTS="-server -Xms1g -Xmx2g -XX:PermSize=256m -XX:MaxPermSize=512m"
3. 优化线程池配置(针对线程数耗尽)
若日志中出现unable to create new native thread,说明线程数超过系统或Tomcat限制,需调整server.xml中的线程池参数:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500" -- 最大线程数(默认200,根据并发量调整) -->
minSpareThreads="50"
acceptCount="200"
以上就是关于“Tomcat内存溢出在Linux怎么办”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm