Tomcat

    
参考资料https://www.cnblogs.com/centos2017/p/9956432.html

内存溢出

在Tomcat时,常常会遇到内存溢出的错误,主要是以下2种:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: PermGen space

原理

  • -Xms 为jvm启动时分配的初始内存 比如-Xms200m,表示分配200M
  • -Xmx 为jvm运行分配的最大内存 比如-Xms500m,表示jvm进程最多只能够占用500M内存
  • -Xss 每个线程堆栈的大小 一般情况下256K是足够了。影响了此进程中并发线程数大小
  • -XX PermSize=64M JVM初始分配的非堆内存
  • -XX MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配
    首先了解一下JVM内存管理的机制,然后解释每个参数的含义。
    按照官方的说法:Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。
    在JVM中堆之外的内存称为非堆内存(Non-heap memory)。
    简单来说,堆就是Java代码可及的内存,是留给开发人员使用的,非堆就是JVM留给自己用的。

堆Heap内存

  • JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;
  • JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。
    默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
    空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
    因此服务器一般设置-Xms、-Xmx 相等,以避免在每次GC 后调整堆的大小
    说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemoryError: Java heap space错误,此错误来自JVM,不是Throwable的,无法用try…catch捕捉

非堆内存分配

  • JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
  • 由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
    XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。
    为什么会内存益出:
    (1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。
    (2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。
    这种错误常见在web服务器对JSP进行pre compile的时候。

解决方案

(1) 进入到tomcat的/bin目录下
在bin目录下,创建一个新的文件,
如果是Linxu或Mac系统,创建setenv.sh
如果是Windows系统,创建setenv.bat
(2) 添加配置(Linux/Mac)
在这个文件中添加以下内容

1
2
3
export CATALINA_OPTS="$CATALINA_OPTS -Xms2048m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx2048m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=512m"

如果是Windows系统,使用以下配置

1
set "JAVA_OPTS=%JAVA_OPTS% -Xms2048m -Xmx2048m-XX:MaxPermSize=512m -server"

(3) 完成以上配置后,启动Tomcat服务可以使用以下2种命令(Linux/Mac):

1
2
cd apache/bin
./catalina.sh run或者./startup.sh

如果是Windows系统,使用catalina.bat启动Tomcat服务
(4) 查看log日志
在日志中,启动Tomcat时,可以看到刚刚配置的参数。

打赏
0%