最近在tomcat 上部署工程的时候,发现工程一直起不来,查看日志发现前端送给后台的数据是正常的,后天也返回了数据给前端。
并且前端返回了一个PermGen space 内存不足的错误,然后才发现是tomcat的内存空间不足。
tomcat 的内存泄露主要存在三种形式:
1.java.lang.OutOfMemoryError:Java heap space ---JVM Heap(堆)溢出
虚拟机在启动时会自动设置堆得大小,初始化的值时物理内存的1/64
2.java.lang.OutOfMemoryError: PermGen space
PermGen space 指内存的永久保存区域。这块内存主要是存放class 和 meta信息的,Class在被Load的时候放入到PermGen space 区域,它和存放instance的Heap区域不同,sun的GC不会再主程序运行期间对PermGen space 进行清理,所以如果你的APP会载入很多Class的话,就可能会出现PermGen space 溢出的错误。
3.java.lang.StackOverflowError --栈溢出
栈溢出表示函数调用的层数过多
JAVA内存JAVA_OPTS的参数设置说明
JAVA_OPTS="-server -Xms2018m -Xmx2048m -Xss521k"
-server:一定要作为第一个参数,在多个CPU时性能最佳
-Xms:初始Heap大小 使用的最小内存
-Xmx:heap 使用的最大内存
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-Xss 15120 这使得jBoss每增加一个线程就会消耗15M内存
修改时在tomcat的bin下的catalina.sh中的cygwin=false前面加入
JAVA_OPTS=‘‘-server -Xms512m -Xmx1024m -XX:persize=512m -XX:MaxPermSize=1024m"