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参数值。