1.指定使用JDK的路徑和vm參數配置
修改bin文件中的catalina.bat,大約95行setlocal之上加入如下內容:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M//配置vm參數,根據系統實際情況配置
set JAVA_HOME=...\jdk1.8.0_92//指定相應版本的jdk路徑
set JRE_HOME=...\jdk1.8.0_92\jre
堆內存分配
-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。一般建議堆的最大值設置為可用內存的最大值的80%,並將-Xms和-Xmx選項設置為相同,其目的是為了能夠在java垃圾回收機制清理完堆區后不需要重新分隔計算堆區的大小而浪費資源。
JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。默認空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx相等避免在每次GC 后調整堆的大小。
持久態內存內存分配
JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
2.修改server.xml
修改conf路徑下的server.xml,將
<!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> -->
修改為
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" //最大並發數,默認設置 200,一般建議在 500 ~ 800,根據硬件設施和業務來判斷 minSpareThreads="100" //Tomcat 初始化時創建的線程數,默認設置 25 prestartminSpareThreads = "true"//在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等於 true,minSpareThreads 的值就無效 maxQueueSize = "100"//最大的等待隊列數,超過則拒絕請求 />
修改默認的鏈接參數配置,將
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改為
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" //Tomcat 8 設置 nio2 更好,Tomcat 6、7設置nio更好:org.apache.coyote.http11.Http11NioProtocol connectionTimeout="20000" maxConnections="10000" redirectPort="8443" enableLookups="false" //禁用DNS查詢 acceptCount="100" //指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 maxPostSize="10485760" //以 FORM URL 參數方式的 POST 提交方式,限制提交最大的大小,默認是 2097152(2兆),它使用的單位是字節。10485760 為 10M。如果要禁用限制,則可以設置為 -1。 compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" //用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因為該服務器是一個多核CPU,如果是多核 CPU 一般配置為 2. compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" URIEncoding="utf-8" />
3.關於Tomcat不定期close_wait過多的問題
服務器啟動一段時間后出現如下問題:
解決:close_wait 是什么,這個狀態與 time_wait 有一定的相似之處,都會持有這個連接一定的時間不放。我們知道,幾乎所有的操作系統對單個進程的句柄數(連接數)都有限制,例如多數 linux 系統默認是 1024 個。因為那些處於 wait 的連接太多,導致可用連接應接不暇。禁用 wait ,讓連接在返回后立馬關閉,成為一個可用連接。
以 tomcat 為例:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" maxThreads="1000" URIEncoding="UTF-8" keepAliveTimeout="0" />
注意 keepAliveTimeout="0" 即為關鍵所在
參考鏈接:
http://blog.csdn.net/jiang1245764446/article/details/51898723
https://segmentfault.com/q/1010000003919178