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(永久保存區最大值)