linux/centos 解决Tomcat内存溢出,centostomcat

柔情痞子 提交于 2019-12-01 04:50:17

linux/centos 解决Tomcat内存溢出,centostomcat


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


一、常见的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.StackOverflowError                                  即栈溢出

 

解释说明: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) 

TOMCAT 内存溢出错误

先试试这个:
-Xms64m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256m 

下面是找了2篇文章

答案1
设置Tomcat启动的初始内存
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可
进行设置
三、实例,以下给出1G内存环境下java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: 
NewSize=192m -XX:MaxNewSize=384m"
CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m 
-XX:NewSize=192m -XX:MaxNewSize=384m"
Linux:
在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh
添加:JAVA_OPTS='-Xms512m -Xmx1024m'
要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
Windows
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m 
如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.
但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,
就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..
windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.
解决办法:
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
加入 -Xms300m -Xmx350m 
重起tomcat服务,设置生效 

答案2
Tomcat 的JVM 内存溢出问题的解决
关键字: tomcat 的jvm 内存溢出问题的解......余下全文>>
 

tomcat提示内存溢出,怎解决

Perm区溢出了,可能是你的SSH包加了之后默认启动加载的东西多了导致的。
java虚拟机对非堆区内存配置的两个参数:
1、-XX:PermSize:表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)
2、-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。

配置这两个启动参数试试

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!