Tomcat优化总结
一、内存溢出问题
Linux设置启动脚本
[root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.sh
#________________________________________________________________________________________________________________start
225 # Bugzilla 37848: only output this if we have a TTY
226 if [ $have_tty -eq 1 ]; then
227 JAVA_OPTS="$JAVA_OPTS -server -Xms512m -Xmx4096m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"
228 echo "Using CATALINA_BASE: $CATALINA_BASE"
#________________________________________________________________________________________________________________end
解释
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
一般“-Xms”是“-Xmx”的1/4,“-XXermSize”是“-XX:MaxPermSize”的1/2。
因此一般建议堆的最大值设置为可用内存的最大值的80%。
原因:
发现很多人把问题归因于:spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出。
然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat,还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。
但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?
Tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生,于是有人对更基础的JVM做了检查,发现了问题的关键。
原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述,本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。
而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
=================================================================================================================================================================================
二、连接池优化
1,配置文件解析
接受关闭Tomcat命令的的端口:
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml
<Server port="8005"shutdown="SHUTDOWN">
定义数据库连接池:
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
定义配置共享线程池,用于客户端和服务器端的连接控制:
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml
#________________________________________________________________________________________________________________start
<Executor name="tomcatThreadPool"namePrefix="catalina-exec-"
minSpareThreads="100"
maxSpareThreads="500"
maxThreads="3000"
acceptCount="100"
maxIdleTime="60000"
/>
#________________________________________________________________________________________________________________end
配置Engine,注意defaultHost=""中,必须要与host中的一个相同,即指定默认网站。
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99
<Engine name="Catalina" defaultHost="www.00peixun.com">
使用上面配置的数据库连接池
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/>
使用上面配置的共享线程池来控制客户端的连接,优化调度服务器资源。
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml
#________________________________________________________________________________________________________________start
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="30000"
redirectPort="8443"
executor="tomcatThreadPool"
enableLookups="false"
useBodyEncodingForURI="true"
/>
#________________________________________________________________________________________________________________end
配置虚拟主机
[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml
#________________________________________________________________________________________________________________start
<Host name="www.00peixun.com"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path=""docBase="/home/www/game" debug="0"reloadable="false"
crossContext="true"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log." suffix=".txt"pattern="common" resolveHosts="false"/>
-->
</Host>
#________________________________________________________________________________________________________________end
1、minSpareThreads="100":设置Tomcat初始化时创建的socket 线程数,并且在一些线程被使用后,会不断地创建新的线程,以致使空闲线程至少保持minSpareThreads所设置的数目,默认值为4
2、maxSpareThreads="500":设置Tomcat连接器最大空闲socket 线程数,当一些连接断开后,会不断的释放出线程,当空与线程超过maxSpareThreads所设置的数目时,会主动关闭超出的线程以节省资源默认值为50
3、maxThreads="3000":设定处理客户请求的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目,这个值不会额外影响性能,因此可以适当加大,但让太大会碰到流量攻击哦,默认值为200.
4、acceptCount="100":设定在监听端口队列中的最大客户请求数,默认值为10,如果队列已满客户请求将被拒绝。可用线程全部用完时,其他的连接全部放入队列,队列里的最大数目就是acceptCount设定的,超出这个数目将拒绝连接
5、connectionTimeout:定义建立客户连接超时的时间,默认这为20000毫秒。如果为0,表示不限制建立客户连接的时间。
6、maxIdleTime="60000":超过最小活跃线程数量的线程,如果空闲时间超过这个设置后,会被关闭。默认是1分钟
7、useBodyEncodingForURI:表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,默认值是false.
8、redirectPort:指定转发端口。
9、connectionTimeout:定义建立客户连接超时的时间,默认这为20000毫秒。如果为-1,表示不限制建立客户连接的时间。
10、useBodyEncodingForURI:表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,默认值是false.
注意
Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制....
(minProcessors:服务器启动时创建的最小处理线程数,即使没有任何HTTP请求,Tomcat也要保持至少这么多线程以等待处理;
maxProcessors:同时最大的处理线程数,如果系统中已经有这个数字的线程,那么更多的连接请求将进入排队。)
Tomcat5中可以通过修改minSpareThreads和minSpareThreads的值来控制
APR库使用
Tomcat中使用APR库,其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。
可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
一般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,一般建议拷贝库文件tcnative- 1.dll到Tomcat的bin目录下。
而在Linux下,可以直接解压和安装bin目录下的tomcat_native.tar.gz文件,编译之前要确保apr库已经安装。
怎么才能判断Tomcat是否已经启用了APR库呢?方法是通过看Tomcat的启动日志:
如果没有启用APR,则启动日志一般有这么一条:
org.apache.coyote.http11.Http11Protocol start
如果启用了APR,则这条日志就会变成:
org.apache.coyote.http11.Http11AprProtocol start
tcnative-1.dll 下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/
Tomcat优化总结的更多相关文章
- tomcat优化
tomcat优化:vim catalina.sh添加:JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -X ...
- windows tomcat 优化
windows tomcat 优化 1. tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...
- Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法
Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...
- tomcat优化-有改protocol 和 缓存 集群方案
tomcat优化 在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验. 1. 服务器资源 服务器所能提供CPU.内存.硬 ...
- tomcat 优化配置 java-8 tomcat-7
tomcat 优化配置 , 说明 一.并发优化 1.JVM调优 以下为1G物理内存tomcat配置: JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256 ...
- Tomcat 优化方案 和 配置详解(转)
转自 Tomcat 优化方案 和 配置详解 http://201605130349.iteye.com/blog/2298985 Server.xml配置文件用于对整个容器进行相关的配置. <S ...
- Tomcat优化之容易集合经验
Tomcat优化1. 如何加大tomcat连接数在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有: maxThreads : t ...
- tomcat优化实例
———————————————————————————————————— 一.运行模式优化 修改tomcat运行模式为nio<Connector port="80" prot ...
- tomcat优化之安装并配置apr库
在谈到tomcat优化时,必然要说到apr库,这个库是C语言实现的,tomcat通过JNI方式使用该库可以大大提高性能. tomcat在使用apr时需要安装apr,apr-util和tomcat-na ...
- tomcat优化和JVM修改内存
Tomcat中的线程池(APR和ThreadPool) 2. 在Connector中指定使用共享线程池: <Connector executor="tomcatThreadPool&q ...
随机推荐
- Eclipse 文本显示行号
- [reprint]useful linux commands
linux一说都是搞开发玩的,敲敲键盘就能完成所有的工作.其实你也可以这么玩,玩游戏的除外哦. 那我们就来侃侃如何玩,linux是命令的天下,高级的命令那是相当的多,但是我们正真用到的也就那么几个看你 ...
- 【你吐吧c#每日学习】10.29 C#字符串类型&Common operators
backslash \反斜杠 escape sequence 转义字符 double quote 双引号 new line 新行字符 Bell アラート Console.WriteLine(" ...
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记52:国际化 fmt 标签,国际化的总结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Eclipse下配置C++开发环境(转)
1. 首先确保你的电脑上已经安装了Java,如果没有,或者不确定,请到官网上下载并安装,网址如下(这一步我就不详述了): http://www.java.com/zh_CN/ 2. 到官网上下载并 ...
- .NET: C#: 获取当前路径
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- dbms_sql包的用法
http://blog.itpub.net/20948385/viewspace-691398 对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: open cursor ...
- Mysql子查询、关联查询
mysql中update.delete.install尽量不要使用子查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).orde ...
- [转]编译Android源代码常见错误解决办法
1. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when ...