Tomcat的jvm配置
Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,JAVA程序启动时JVM会分配一个初始内存和最大内存给程序。当程序需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。
1.Tomcat异常类型
常见的Java内存溢出有以下三种:
- 1. Java.lang.OutOfMemoryError:java heap space 堆溢出。
解释说明:JVM在启动的时候会自动设置JVM Heap(java堆)的值,JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。其初始空间默认是物理内存的1/64,最大空间不可超过物理内存的1/4(Tomcat默认可以使用的内存为128MB)。JVM提供-Xmn -Xms -Xmx等选项来进行相关设置。
出错场景:在JVM中,如果98%的时间是用于GC,且可用的Heap size不足2%时,将会出现JVM Heap溢出
解决方法:修改JVM Heap的大小。
- 2. java.lang.OutOfMemoryError:PermGen space 非堆溢出
解释说明:PermGen space是指内存的永久保存区域。这个区域主要存放Class和Meta信息,Class在被Loader时就会被放入PermGen space。
出错场景:常见于web服务器对JSP进行pre compile的时候, 如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:修改MaxPermSize大小。建议将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存
- 3. java.lang.OutOfMemoryError:unable to create new native thread.无法创建新的线程(较少见)
解释说明:这种现象比较少见,主要与JVM占用系统内存的比例有关,如果JVM占用的系统内存太大,导致创建线程所需要的物理内存有限。线程的大小是一定的,从而导致线程的数量受到限制。
解决方法:结合操作系统进行相关调整,结合不同情况对tomcat内存进行分配。
2.具体解决方法
前两种内存溢出通过设置tomcat的JVM配置进行解决。具体如下:
Linux(以1G内存为例):在%tomcat安装路径%/bin/catalina.sh文件中加入如下语句:
JAVA_OPTS='-server -Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxPermSize=128m'
其中:“m”说明单位是MB,否则默认是KB。
设置完后,需重新启动tomcat才生效。
1 java heap(java堆)设置
-Xms :Xms java Heap初始大小。 默认是物理内存的1/64;
-Xmx :java heap最大值。不超过物理内存的80%;
-Xmn :java heap最小值,一般设置为Xmx的4分之一;
备注:一般的要将-Xms和-Xmx选项设置为相同。
32位操作系统下JVM内存不超过2GB
2 PermGen space(永久保存区域)设置
-XX:PermSize:设定内存的永久保存区域;
-XX:MaxPermSize:设定最大内存的永久保存区域;
备注:-XX:MaxPermSize与-Xmx的总和不超过物理内存。
3 JVM其他参数:
-server/-client: 两个参数用于设置虚拟机使用何种运行模式,放在第一个
在windows上,缺省的虚拟机类型为client模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。
在Linux,Solaris上缺省采用server模式。server模式启动比client慢,但可获得更高的运行性能。对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。
-XX:NewSize 新生成的池的初始大小,缺省值为2M。
-XX:MaxNewSize 新生成的池的最大大小,缺省值为32M。
-verbose:gc 现实垃圾收集信息。
-Xloggc:gc.log 指定垃圾收集日志文件。
-XX:+UseParNewGC 缩短minor收集的时间。
-XX:+UseConcMarkSweepGC 缩短major收集的时间。
-XX:userParNewGC 可用来设置并行收集(多CPU)。
-XX:ParallelGCThreads 可用来增加并行度(多CPU)。
-XX:UseParallelGC 设置后可以使用并行清除收集器(多CPU)。
备注:查询Tomcat的JVM内存方法:
在%tomcat安装路径%/conf/tomcat-users.xml中添加如下语句:
开启tomcat后 访问port/manager/status并输入用户密码(port为自己定义的ip以及端口号)即可查看JVM参数值。