在Tomcat上运行j2ee项目代码时,常常会出现内存溢出的状况,解决办法是在系统参数中增长系统参数: java
window下, 在catalina.bat最前面:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;
必定加在catalina.bat最前面。linux
linux下,在catalina.sh最前面增长:web
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"apache
注意:先后两者区别,有无set,有无双引号。windows
首先。打开/conf/server.xml,增长tomcat
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />服务器
最大线程500(通常服务器足以),最小空闲线程数20,线程最大空闲时间60秒。网络
而后,修改<Connector ...>节点,增长executor属性,如:并发
<Connectorexecutor="tomcatThreadPool"
port="80"app
protocol="HTTP/1.1"
maxThreads="600"
minSpareThreads="100"
maxSpareThreads="300"
connectionTimeout="60000"
keepAliveTimeout="15000"
maxKeepAliveRequests="1"
redirectPort="443"
....../>
maxThreads:Tomcat可建立的最大的线程数,每个线程处理一个请求;
minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数;
maxSpareThreads:最大备用线程数,一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程;
acceptCount:指定当全部可使用的处理请求的线程数都被使用时,能够放处处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝链接。
connnectionTimeout:网络链接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。一般可设置为30000毫秒。
enableLookups:是否容许DNS查询
注意:能够多个connector公用1个线程池。
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="60000"
keepAliveTimeout="15000"
maxKeepAliveRequests="1"
redirectPort="443"
maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>
参数说明:
connectionTimeout -网络链接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。一般可设置为30000毫秒。 keepAliveTimeout -长链接最大保持时间(毫秒)。此处为15秒。 maxKeepAliveRequests -最大长链接个数(1表示禁用,-1表示不限制个数,默认100个。通常设置在100~200之间)the maximum number of HTTP requests that can be held in the pipeline until the connection is closed by the server. Setting this attribute to 1 disables HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 allows an unlimited number of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100. maxHttpHeaderSize - http请求头信息的最大程度,超过此长度的部分不予处理。通常8K。 URIEncoding -指定Tomcat容器的URL编码格式。 acceptCount -指定当全部可使用的处理请求的线程数都被使用时,能够放处处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。defines the maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full are refused. The default value is 10. disableUploadTimeout -上传时是否使用超时机制 enableLookups -是否反查域名,取值为:true或false。为了提升处理能力,应设置为false bufferSize - defines the size (in bytes) of the buffer to be provided for input streams created by this connector. By default, buffers of 2048 bytes are provided. maxSpareThreads -作多空闲链接数,一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程 the maximum number of unused request processing threads that are allowed to exist until the thread pool starts stopping the unnecessary threads. The default value is 50. maxThreads -最多同时处理的链接数,Tomcat使用线程来处理接收的每一个请求。这个值表示Tomcat可建立的最大的线程数。。the maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200. minSpareThreads -最小空闲线程数,Tomcat初始化时建立的线程数the number of request processing threads that are created when this Connector is first started. The connector will also make sure it has the specified number of idle processing threads available. This attribute should be set to a value smaller than that set for maxThreads. The default value is 4. minProcessors -最小空闲链接线程数,用于提升系统处理性能,默认值为10。(用于Tomcat4中) maxProcessors -最大链接线程数,即:并发处理的最大请求数,默认值为75。(用于Tomcat4中)
备注:
Tomcat4中能够经过修改minProcessors和maxProcessors的值来控制线程数。
在Tomcat5+主要对如下参数调整
maxThreads
Tomcat使用线程来处理接收的每一个请求。这个值表示Tomcat可建立的最大的线程数。
acceptCount
指定当全部可使用的处理请求的线程数都被使用时,能够放处处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout
网络链接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。一般可设置为30000毫秒。
minSpareThreads
Tomcat初始化时建立的线程数。
maxSpareThreads
一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程。
Tomcat6支持分布式部署,能够实现集群功能,提升响应能力。
打开cataline.bat,增长一行
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
linux下修改cataline.sh:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_BASE\conf\logging.properties"
注意JDK\jre\lib\management\management.properties文件必须存在。
从新启动tomcat节点,而后用jconsole链接(此处端口wei10090)
在server.xml的Host标签中增长行
<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />
path表明上下文名称,空表示是根路径。
1、常见的Java内存溢出有如下三种:
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
能够利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion之和。
在JVM中若是98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。
解决方法:手动设置JVM Heap(堆)的大小。
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。
为何会内存溢出,这是因为这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不一样,sun的GC不会在主程序运行期对PermGen space进行清理,因此若是你的APP会载入不少CLASS的话,就极可能出现PermGen space溢出。
解决方法: 手动设置MaxPermSize大小
3. java.lang.StackOverflowError ---- 栈溢出
栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是同样的。函数的调用过程都体如今堆栈和退栈上了。
调用构造函数的 “层”太多了,以至于把栈区溢出了。
一般来说,通常栈区远远小于堆区的,由于函数调用过程每每不会多于上千层,而即使每一个函数调用须要 1K的空间(这个大约至关于在一个C函数内声明了256个int类型的变量),那么栈区也不过是须要1MB的空间。一般栈的大小是1-2MB的。
一般递归也不要递归的层次过多,很容易溢出。
解决方法:修改程序。
在生产环境中tomcat内存设置很差很容易出现jvm内存溢出
一、 linux下的tomcat:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入如下行:
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
二、 若是tomcat 5注册成了windows服务,以services方式启动的,则须要修改注册表中的相应键值。
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\Java,右侧的Options
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
加入 -Xms256m -Xmx512m
重起tomcat服务,设置生效
三、若是tomcat 6注册成了windows服务,或者windows2003下用tomcat的安装版,
在/bin/tomcat6w.exe里修改就能够了 。
四、 若是要在myeclipse中启动tomcat,上述的修改就不起做用了,可以下设置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的
Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m
-server:必定要做为第一个参数,在多个CPU时性能佳
-Xms:java Heap初始大小。 默认是物理内存的1/64。
-Xmx:java heap最大值。建议均设为物理内存的一半。不可超过物理内存。
-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。(我用visualvm.exe查看的)
-XX:MaxPermSize:设定内存的永久保存区最大 大小,缺省值为64M。(我用visualvm.exe查看的)
-XX:SurvivorRatio=2 :生还者池的大小,默认是2,若是垃圾回收变成了瓶颈,您能够尝试定制生成池设置
-XX:NewSize: 新生成的池的初始大小。 缺省值为2M。
-XX:MaxNewSize: 新生成的池的最大大小。 缺省值为32M。
若是 JVM 的堆大小大于 1GB,则应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的50% 到60% 分配给新生成的池。调大新对象区,减小Full GC次数。
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每一个线程的Stack大小,“-Xss 15120”这使得JBoss每增长一个线程(thread)就会当即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,通常设置为Xmx的三、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size比较大并且Major收集时间较长的状况下使用更合适。
-XX:userParNewGC 可用来设置并行收集【多CPU】
-XX:ParallelGCThreads 可用来增长并行度【多CPU】-XX:UseParallelGC 设置后可使用并行清除收集器【多CPU】