1. jvm堆栈设置:
修改TOMCAT_HOME/bin/catalina.bat:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:PermSize=512m -XX:MaxPermSize=512m
-server:比-client拥有更大、更高的并发处理能力。
-Xms -Xmx:初始堆内存大小和最大对内存大小,大小可以一样。
-XX:NewSize -XX:MaxNewSize:默认年轻代空间的大小和最大大小。
-XX:PermSize -XX:MaxPermSize:默认持久代空间的大小和最大大小。
部分引用http://www.cnblogs.com/interdrp/archive/2010/11/24/1887106.html
2. jvm运行参数查看:
jps :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat :一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 jmap :打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 jconsole :一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
D:\>jmap -histo 4636 > d:log.log #打印堆信息 D:\>jmap -dump:live,format=b,file=d:\log.log 4636 #生成二进制堆信息,与下一步协同使用 D:\>jhat log.log #根据提示,访问IP:7000查看heap信息
http://jiajun.iteye.com/blog/443196
http://risheng.iteye.com/blog/1453098
3. tomcat参数(以tomcat-7.0.23说明):
<Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="90" maxIdleTime="600000" /> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8099" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="40000" acceptCount="300" maxKeepAliveRequests="1" redirectPort="8443" executor="tomcatThreadPool" /> <!-- A "Connector" using the shared thread pool--> <!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation --> <!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool" /> </Service>
http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
Executor节点:配置线程池,供连接器(Connector)引用
a. maxThreads-线程池可创建的最大线程数,默认200
b. minSpareThreads-最小备用线程数,tomcat启动时初始化的线程数,默认25
c. maxIdleTime-如果线程数大于minSpareThreads时,空闲线程持续空闲时间超过该时间时会被销毁,默认60000(1分钟)
Connector节点:
a. protocol-本人不甚清楚,故不作解释,不过有以下可选项:
org.apache.coyote.http11.Http11Protocol - blocking Java connector
org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector
org.apache.coyote.http11.Http11AprProtocol - the APR/native connector
默认值是HTTP/1.1,根据环境变量自动选择blocking Java connector或the APR/native connector。tomcat启动后可以根据Starting ProtocolHandler信息判断使用的是哪种协议。
基本上,bio性能最低下,nio次之,最好是apr。不过有网友说使用Apr协议时,要安装apr和native环境,不过我并没有做这些,也是用的apr。
http://passover.blog.51cto.com/2431658/732629
http://www.oschina.net/question/54100_16195
b. acceptCount-当所有可用请求处理线程用尽时,队列可以缓存的请求数。如果队列已满,新上来的请求会被refuse掉。默认值100
c. acceptorThreadCount-用于接收请求的线程数。在多CPU机器上可以提高该数值,但真心没必要超过2。同时,对于非keep-alive的连接,你也想要提高该数值。默认1。这是官方的解释,我个人不太理解。
d. connectionTimeout-在accept来自client的connect后,等待请求uri行出现的最大时间。设置为-1,表示无限等待。如果disableUploadTimeout=true,也会作为等待请求体的超时限制。disableUploadTimeout值默认true。
e. maxKeepAliveRequests-对于同一个连接,允许的最多http请求次数,超过限制值server主动关闭连接。1表示禁用keep-alive,-1表示允许无数次HTTP请求,默认取100。keep-alive特性可看下边的介绍。
4. keep-alive:
http://backend.blog.163.com/blog/static/2022941262014029105618173/
http://blog.csdn.net/ctthuangcheng/article/details/8596818
http1.1(http1.0不是标准,依服务器而定)是支持长连接的,长连接能够保证服务器和客户端的socket能够高效利用,减少握手等额外的开销。在HTTP请求头中Connection: keep-alive表示支持并启用长连接,Connection: close表示使用短连接。
长连接允许连接建立后,client发起多次HTTP请求,这个过程中既可以在达到server的maxKeepAliveRequests之前由client主动关闭,也可以在达到maxKeepAliveRequests限制后,server主动关闭,server主动关闭时,其返回的HTTP/1.1 200 OK信息中会包含Connection: close。
短连接:在每次server返回HTTP/1.1 200 OK时,都会包含Connection: close。
主动关闭连接的一方,会出现大量的TIME_WAIT状态的连接。
5. TIME_WAIT状态:
TCP的3个常见状态:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。
连接会在主动关闭它的机器里以TIME_WAIT状态存在2个MSL时间,(MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。winddows操作系统是2分钟)。
如果双方协定启用keep-alive,在客户端建立大量短连接并主动关闭后,会在2MSL时间内存在大量的处于TIME_WAIT状态的连接。如果达到上限,就无法建立新的请求了。不过这种情况比较少遇到。
如果禁用keep-alive,也同样会在服务端保存大量处于TIME_WAIT状态的连接。
http://blog.csdn.net/shootyou/article/details/6622226#
http://elf8848.iteye.com/blog/1739571