欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

linux解决Tomcat内存溢出的问题

程序员文章站 2023-11-16 13:09:04
tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个java虚拟机。java程序启动时jvm会分配一个初始内存和最大内存给程序。当程序需要的内存超出内存的最大值...

tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个java虚拟机。java程序启动时jvm会分配一个初始内存和最大内存给程序。当程序需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。

一、常见的java内存溢出有以下三种:

1. java.lang.outofmemoryerror: java heap space 即jvm heap溢出

解释说明:jvm在启动的时候会自动设置jvm heap的值,jvm堆的设置是指java程序运行过程中jvm可以调配使用的内存空间的设置。其初始空间默认是物理内存的1/64,最大空间不可超过物理内存。jvm提供-xmn -xms -xmx等选项来进行设置。

出错场景:在jvm中,如果98%的时间是用于gc,且可用的heap size不足2%时,将会出现jvm heap溢出

解决方法:修改jvm heap的大小。

2. java.lang.outofmemoryerror: permgen space 即permgen space溢出

解释说明:permgen space是指内存的永久保存区域。这个区域主要存放class和meta信息,class在被load时就会被放入permgen space。

出错场景:如果app载入很多class,就可能会出现permgen space溢出。(因为sun的gc不会在程序运行时对permgen space进行清理)常见于web服务器对jsp进行pre compile的时候

解决方法:修改maxpermsize大小

3. java.lang.*error 即栈溢出

解释说明:jvm采用的是栈式的虚拟机,函数的调用过程都体现在堆栈和退栈上。

出错场景:通常栈的大小是1-2mb的,如果调用构造函数的 “层”太多,则会出现栈溢出

解决方法:修改程序

二、tomcat的jvm内存溢出解决方法

在生产环境中,tomcat内存设置不好很容易出现jvm内存溢,解决方法就是修改tomcat中的catalina.sh文件。
在catalina.sh文件中,找到cygwin=false,在这一行的前面加入参数,具体如下

# vi tomcat_home/bin/catalina.sh
java_opts="-server -xms800m -xmx800m -xx:permsize=256m -xx:maxpermsize=512m -xx:maxnewsize=512m"

其他说明:

1.“m”说明单位是mb,否则默认是kb
2.一般使用物理内存的80%作为堆大小
3.一般把-xms和-xmx设为一样大
4.一般把-xmn设置为-xmx值的1/4
5.一般将堆的总大小的50%到60%分配给新生成的池

三、jvm参数说明:

-server 一定要作为第一个参数,启用jdk的server版本,在多个cpu时性能佳
-xms java heap初始大小。 默认是物理内存的1/64。
-xmx java heap最大值。建议均设为物理内存的80%。不可超过物理内存。
-xmn java heap最小值,一般设置为xmx的3、4分之一。
-xx:permsize 设定内存的永久保存区初始大小,缺省值为64m。
-xx:maxpermsize 设定内存的永久保存区最大大小,缺省值为64m。
-xx:survivorratio=2 生还者池的大小,默认是2。如
-xx:newsize 新生成的池的初始大小。 缺省值为2m。
-xx:maxnewsize 新生成的池的最大大小。 缺省值为32m。
+xx:aggressiveheap 让jvm忽略xmx参数,疯狂地吃完一个g物理内存,再吃尽一个g的swap。
-xss 每个线程的stack大小
-verbose:gc 现实垃圾收集信息
-xloggc:gc.log 指定垃圾收集日志文件
-xx:+useparnewgc 缩短minor收集的时间
-xx:+useconcmarksweepgc 缩短major收集的时间
-xx:userparnewgc 可用来设置并行收集(多cpu)
-xx:parallelgcthreads 可用来增加并行度(多cpu)
-xx:useparallelgc 设置后可以使用并行清除收集器(多cpu)

以上这篇linux解决tomcat内存溢出的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。