Java Tomcat内存溢出的解决方法
原因:JVM堆内存不足,无法分配新对象(如大量数据查询、循环内创建对象等)。
解决步骤:
catalina.bat/Linux下catalina.sh),添加-Xms(初始堆大小)和-Xmx(最大堆大小)参数,建议两者设置为相同值以减少GC次数(如-Xms512m -Xmx1024m,可根据服务器内存调整,最大不超过物理内存的80%)。原因:
PermGen(永久代)用于存储类元数据、静态变量等,若应用加载大量第三方jar或频繁动态生成类(如反射、动态代理),会导致溢出。PermGen被Metaspace(元空间)取代,默认使用本地内存,但仍可能因类加载过多溢出。-XX:PermSize(初始永久代大小,如64M)和-XX:MaxPermSize(最大永久代大小,如128M)。-XX:MaxPermSize替换为-XX:MaxMetaspaceSize(如-XX:MaxMetaspaceSize=256m),并限制元空间使用本地内存(默认无上限,但需避免占用过多系统内存)。shared/lib目录(避免每个Web应用重复加载),清理无用的类加载器(如动态生成的类及时卸载)。原因:系统线程资源耗尽(如应用频繁创建线程且未使用线程池)。
解决步骤:
java.util.concurrent.ThreadPoolExecutor)替代直接创建线程,控制并发线程数(如核心线程数设为10,最大线程数设为100)。ulimit -u查看当前限制,可通过ulimit -u 65535临时调整,永久修改需编辑/etc/security/limits.conf)。原因:NIO的DirectByteBuffer分配的直接内存超过限制(默认无上限,依赖JVM参数)。
解决步骤:
-XX:MaxDirectMemorySize参数(如-XX:MaxDirectMemorySize=512m),限制直接内存使用。logs/catalina.out或应用日志)中搜索OutOfMemoryError,确定溢出类型(如Java heap space、PermGen space)。jconsole、jvisualvm)或第三方工具(VisualVM、MAT、YourKit)实时监控内存使用情况,查看堆内存、元空间、线程数等指标的变化趋势。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof),或在运行时通过jmap命令生成(jmap -dump:format=b,file=dump.hprof <pid>)。Eclipse MAT(Memory Analyzer Tool)打开堆转储文件,查找占用内存最多的对象(如大集合、重复创建的对象),定位内存泄漏的根源(如静态集合持有对象引用、未关闭的资源)。-XX:+UseG1GC适用于大内存应用,-XX:+UseCMSCompactAtFullCollection适用于低延迟场景)。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log参数,记录GC详情,分析GC频率、耗时及回收效果,据此调整堆大小或GC参数。-Xms和-Xmx的值需根据服务器物理内存调整(如8GB内存的服务器,可设置为-Xms4g -Xmx6g),避免设置过大导致操作系统内存不足。JMeter)模拟高并发场景,评估应用内存使用情况,提前调整参数避免线上溢出。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。