Tomcat性能优化
发布日期:2022-02-19 23:50:33 浏览次数:15 分类:技术文章

本文共 7657 字,大约阅读时间需要 25 分钟。

默认参数不适合生产环境使用,因此需要修改一些参数

 1、修改启动时内存参数、并指定JVM时区 :

 Tomcat上运行j2ee项目代码时,经常会出现内存溢出的情况,解决办法是在系统参数中增加系统参数: 

 window下, 在catalina.bat最前面:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;
一定加在catalina.bat最前面。

 linux下,在catalina.sh最前面增加:

JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

 注意:前后二者区别,有无set,有无双引号。

 2、线程池配置(Tomcat6下)

使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。使用方式:

首先。打开/conf/server.xml,增加

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />

最大线程500(一般服务器足以),最小空闲线程数20,线程最大空闲时间60秒。

然后,修改<Connector ...>节点,增加executor属性,如:

<Connectorexecutor="tomcatThreadPool"
               port="80"

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个线程池。

 

3、调整连接相关Connector的参数:

<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 -是否反查域名,取值为:truefalse。为了提高处理能力,应设置为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中可以通过修改minProcessorsmaxProcessors的值来控制线程数。

Tomcat5+主要对以下参数调整
maxThreads
 Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
 acceptCount 
 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
 connnectionTimeout 
 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
 minSpareThreads 
 Tomcat初始化时创建的线程数。
 maxSpareThreads 
 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。 

 

 

 4、负载均衡、集群的配置

Tomcat6支持分布式部署,可以实现集群功能,提高响应能力。

 

5

利用JMX监控Tomcat运行情况,需要手工调整启动参数,如下:

打开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

 

6Tomcat增加一个应用

server.xmlHost标签中增加行

<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />

path代表上下文名称,空表示是根路径。

Java内存溢出详解

 

一、常见的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存放ClassMeta信息的,Class在被Load的时候被放入PermGen space区域,它和存放InstanceHeap区域不同,sunGC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。

解决方法: 手动设置MaxPermSize大小

 

3. java.lang.StackOverflowError   ---- 栈溢出
栈溢出了,JVM依然是采用栈式的虚拟机,这个和CPascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。
调用构造函数的太多了,以致于把栈区溢出了。
通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是12MB的。
通常递归也不要递归的层次过多,很容易溢出。

解决方法:修改程序。

 

 

二、解决方法

 

在生产环境中tomcat内存设置不好很容易出现jvm内存溢出。

 

1 linux下的tomcat  

修改TOMCAT_HOME/bin/catalina.sh 
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 

 

2 如果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服务,设置生效

 

3、如果tomcat 6注册成了windows服务,或者windows2003下用tomcat的安装版,

/bin/tomcat6w.exe里修改就可以了 

 

 

 

 

4 如果要在myeclipse中启动tomcat,上述的修改就不起作用了,可如下设置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m

 

 

 

三、jvm参数说明:

 

-server:一定要作为第一个参数,在多个CPU时性能佳 
-Xmsjava Heap初始大小。 默认是物理内存的1/64
-Xmxjava 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物理内存,再吃尽一个Gswap 
-Xss:每个线程的Stack大小,“-Xss 15120”这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k. 

-verbose:gc 现实垃圾收集信息 
-Xloggc:gc.log 指定垃圾收集日志文件 
-Xmnyoung generationheap大小,一般设置为Xmx34分之一 
-XX:+UseParNewGC :缩短minor收集的时间 
-XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size比较大而且Major收集时间较长的情况下使用更合适。

-XX:userParNewGC 可用来设置并行收集【多CPU
-XX:ParallelGCThreads 可用来增加并行度【多CPU
-XX:UseParallelGC 设置后可以使用并行清除收集器【多CPU

 

 

转载地址:https://blog.csdn.net/LesonSong/article/details/74989720 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:javascript基础知识
下一篇:linux常用命令

发表评论

最新留言

感谢大佬
[***.67.49.251]2022年10月01日 14时01分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

2020年的618快来了,电脑该怎么选 2019-12-19 17:40:10
机械键盘怎么选? 2019-12-19 17:40:10
台式电脑鼠标怎么选? 2019-12-19 17:40:10
不同需求下,CPU怎么选? 2019-12-19 17:40:08
电脑主板怎么选? 2019-12-19 17:40:08
显卡怎么选 2019-12-19 17:40:09
台式电脑内存条怎么选? 2019-12-19 17:40:09
台式电脑固态硬盘怎么选? 2019-12-19 17:40:09
台式电脑机械硬盘怎么选? 2019-12-19 17:40:09
2020-08-18 2019-12-19 17:40:07
2020-10-29 2019-12-19 17:40:07
2020-10-30 2019-12-19 17:40:07
Android P 定名为 Android 9.0 2019-12-19 17:40:07
Android P 新功能发布 2019-12-19 17:40:07
访问共享文件夹 2019-12-19 17:40:08
Android 短信群发功能的实现 2019-12-19 17:40:08
Win7 32位旗舰版无法安装.NET 4.6.2 解决方法之一 2019-12-19 17:40:08
c++-----引用和二级指针的关系 2019-12-19 17:40:05
两种getline的用法--iostream和string 2019-12-19 17:40:05
c++中拷贝构造-----深拷贝和浅拷贝 2019-12-19 17:40:06