tomcat内存溢出,堆内存可以分为三个部分:永久保存区域,新生区,老年区。tomcat比较常见的内存溢出包括(OutOfMemoryError:java heap space)和(OutOfMemoryError:PermGen space)两种。
1.OutOfMemoryError:java heap space
heap space通常指程序运行过程中,虚拟机可以调配的内存区域,程序中new的对象在该区域。GC机制会对该区域的内存进行回收,因此该区域的内存是动态的。
该区域内存溢出通常有两个原因:
- 程序存在内存泄露
程序的内存泄漏,需要根据实际情况跟踪排查,找出内存泄漏的原因。
- tomcat参数配置的内存太小了
tomcat参数给虚拟机分配的内存太小了,需要调大内存。
打开TOMCAT_HOME/bin/catalina.bat文件,找到 set JAVA_OPTS= -Xms512m -Xmx512m,根据实际情况修改这两个参数的大小。Xms(初始堆大小)和Xmx(最大堆大小)可以设置为相同大小,最大不要超过可用物理内存的80%。
可通过cmd命令:java -Xmx2048M -version 修改2048的值,来测试最大Xmx的值,如果超出最大值会报错,否则会输出jdk版本。
2.OutOfMemoryError:PermGen space
PermGen space是永久保存区域,该区域用于存放Class和Meta信息,GC不会对该区域进行内存回收,因此该区域内存是相对静态的。如果应用中有较多的Class,而分配的空间不足的话就会出现内存溢出。
针对该区域的内存溢出,可以调整tomcat的参数配置,调大该区域的内存。
打开TOMCAT_HOME/bin/catalina.bat文件,找到-XX:PermSize=128m -XX:MaxPermSize=256m,根据实际情况修改这两个参数的大小。-XX:PermSize(永久保存区初始值),-XX:MaxPermSize(永久保存区最大值)