Tomcat优化总结

1、内存溢出问题html

Linux设置启动脚本web

[root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.shspring

#___________________________________start数据库

    225 # Bugzilla 37848: only output this if we have a TTYapache

    226 if [ $have_tty -eq 1 ]; thentomcat

    227   JAVA_OPTS="$JAVA_OPTS  -server -Xms512m -Xmx4096m   -XX:MaxNewSize=256m -XX:MaxPermSize=256m"服务器

    228   echo "Using CATALINA_BASE:   $CATALINA_BASE"网络

#____________________________________end多线程

解释app

-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根本没办法回收!

2、链接池优化

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

一、minSpareThreads="100":设置Tomcat初始化时建立的socket 线程数,而且在一些线程被使用后,会不断地建立新的线程,以至使空闲线程至少保持minSpareThreads所设置的数目,默认值为4

二、maxSpareThreads="500":设置Tomcat链接器最大空闲socket 线程数,当一些链接断开后,会不断的释放出线程,当空与线程超过maxSpareThreads所设置的数目时,会主动关闭超出的线程以节省资源默认值为50

三、maxThreads="3000":设定处理客户请求的线程的最大数目,这个值也决定了服务器能够同时响应客户请求的最大数目,这个值不会额外影响性能,所以能够适当加大,但让太大会碰到流量攻击哦,默认值为200.

四、acceptCount="100":设定在监听端口队列中的最大客户请求数,默认值为10,若是队列已满客户请求将被拒绝。可用线程所有用完时,其余的链接所有放入队列,队列里的最大数目就是acceptCount设定的,超出这个数目将拒绝链接

五、connectionTimeout:定义创建客户链接超时的时间,默认这为20000毫秒。若是为0,表示不限制创建客户链接的时间。

六、maxIdleTime="60000":超过最小活跃线程数量的线程,若是空闲时间超过这个设置后,会被关闭。默认是1分钟

七、useBodyEncodingForURI:表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行从新编码,默认值是false.

八、redirectPort:指定转发端口。

九、connectionTimeout:定义创建客户链接超时的时间,默认这为20000毫秒。若是为-1,表示不限制创建客户链接的时间。

十、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://tomcat.heanet.ie/native/

(全文完)

相关文章
相关标签/搜索