1. jvm堆棧設置:html
修改TOMCAT_HOME/bin/catalina.bat:java
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:PermSize=512m -XX:MaxPermSize=512mshell
-server:比-client擁有更大、更高的併發處理能力。apache
-Xms -Xmx:初始堆內存大小和最大對內存大小,大小能夠同樣。緩存
-XX:NewSize -XX:MaxNewSize:默認年輕代空間的大小和最大大小。tomcat
-XX:PermSize -XX:MaxPermSize:默認持久代空間的大小和最大大小。服務器
部分引用http://www.cnblogs.com/interdrp/archive/2010/11/24/1887106.html併發
2. jvm運行參數查看: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/443196socket
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