tomcat8.0的內存優化配置及垃圾回收管理

一、Tomcat併發優化

tomcat併發量與其配置息息相關,一般的機器幾百的併發量足矣,如果設置太高可能引發各種問題,內存、網絡等問題也能在高併發下暴露出來,因此,配置參數的設置非常重要。

(1) tomcat併發參數

  1. maxThreads:最大的併發請求數,當cpu利用率高的時候,不宜增加線程的個數,當cpu利用率不高,大部分是io阻塞類的操作時,可以適當增加該值。
  2. maxSpareThreads:Tomcat連接器的最大空閒 socket 線程數
  3. acceptCount:當處理任務的線程數達到最大時,接受排隊的請求個數
  4. connectionTimeout:網絡連接超時,單位毫秒
  5. enableLookups:若爲false則不進行DNS查詢,提高業務能力應設置爲false
  6. disableUploadTimeout:若爲true則禁用上傳超時

      以上是一些比較常用的參數,Tomcat中server.xml配置詳解 會有更加詳細的介紹。

(2) tomcat併發配置

    在conf下的server.xml文件中<Connector>節點進行配置
    <Connector port="8080" protocol="HTTP/1.1"
         connectionTimeout="30000"
         redirectPort="8443"
         maxThreads="400"
         minSpareThreads="50"
         maxSpareThreads="200"
         acceptCount="400"
         enableLookups="false"
         disableUploadTimeout="true"     />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

二、Tomcat內存配置

tomcat一般都有默認的內存大小,其默認值對整個物理內存來說非常小,如果不配置tomcat的內存,會大大浪費服務器的資源,驗證影響系統的性能,所以對tomcat的內存配置對用戶量比較大的系統尤爲重要。

(1) tomcat內存參數

  1. -server:一定要作爲第一個參數,在多個CPU時性能佳
  2. -Xms:java Heap初始大小。 默認是物理內存的1/64。
  3. -Xmx:java heap最大值。建議均設爲物理內存的一半。不可超過物理內存。
  4. -XX:PermSize:設定內存的永久保存區初始大小。缺省值爲64M。
  5. -XX:MaxPermSize:設定內存的永久保存區最大 大小。缺省值爲64M。
  6. -Xmn:young generation(年輕代)的heap大小。一般設置爲Xmx的3、4分之一

(2) tomcat內存配置

     在bin下的catalina.bat文件中echo Using CATALINA_BASE:   "%CATALINA_BASE%"的前一行加入如下代碼。
set JAVA_OPTS=%JAVA_OPTS% -server -Xms8192m -Xmx8192m -Xmn1890m 
  • 1
  • 2
  • 3

三、Tomcat垃圾回收

垃圾回收(gc)機制非常重要,有時系統會因爲內存沒有及時回收導致內存溢出,或是內存飽和出現無法響應用戶請求的情況,這就要要求我們對空閒內存進行清理,以確保系統正常運行,tomcat GC的最佳配置是確保系統正常運行的關鍵。

(1) JVM中對象的劃分及管理

JVM根據運行於其中的對象的生存時間大致的分爲3種。並且將這3種不同的對象分別存放在JVM從系統分配到的不同的內存空間。這種對象存放空間的管理方式叫做Generation管理方式。

  1. Young Generation(年輕代):用於存放“早逝”對象(即瞬時對象)。例如:在創建對象時或者調用方法時使用的臨時對象或局部變量。
  2. Tenured Generation(年老代):用於存放“駐留”對象(即較長時間被引用的對象)。往往體現爲一個大型程序中的全局對象或長時間被使用的對象。
  3. Perm Generation(永久保存區域):用於存放“永久”對象。這些對象管理着運行於JVM中的類和方法。

(2) jvm垃圾蒐集參數

  1. -verbose:gc:顯示垃圾收集信息(在虛擬機發生內存回收時在輸出設備顯示信息)
  2. UseConcMarkSweepGC:開啓此參數使用ParNew & CMS(serial old爲替補)蒐集器
  3. MaxTenuringThreshold:晉升老年代的最大年齡。默認爲15,比如設爲10,則對象在10次普通GC後將會被放入年老代。
  4. -XX:+ExplicitGCInvokesConcurrent:System.gc()可以與應用程序併發執行。
  5. GCTimeRatio:設置系統的吞吐量。比如設爲99,則GC時間比爲1/1+99=1%,也就是要求吞吐量爲99%。若無法滿足會縮小新生代大小。
  6. CMSInitiatingOccupancyFraction:觸發CMS收集器的內存比例。比如60%的意思就是說,當內存達到60%,就會開始進行CMS併發收集。
  7. CMSFullGCsBeforeCompaction:設置在幾次CMS垃圾收集後,觸發一次內存整理。
  8. -Xnoclassgc:禁用類垃圾回收,性能會高一點;
  9. -XX:SoftRefLRUPolicyMSPerMB=N:官方解釋是:Soft reference在虛擬機中比在客戶集中存活的更長一些。其清除頻率可以用命令行參數 -XX:SoftRefLRUPolicyMSPerMB=來控制,這可以指定每兆堆空閒空間的 soft reference 保持存活(一旦它不強可達了)的毫秒數,這意味着每兆堆中的空閒空間中的 soft reference 會(在最後一個強引用被回收之後)存活1秒鐘。注意,這是一個近似的值,因爲 soft reference 只會在垃圾回收時纔會被清除,而垃圾回收並不總在發生。系統默認爲一秒。

      以上是一些基本的參數配置,通過JVM內存管理——垃圾蒐集器參數精解查看更詳細的配置,通過Tomcat中Java垃圾收集調優查看原理

(3) tomcat垃圾蒐集配置

tomcat的垃圾蒐集是和內存設置一起配置的,內存和gc的設置也不是越大越好,良好的比例可以使你的系統性能提升一般甚至更多,下面是tomcat7 ,服務器物理內存16g的標準配置

在bin下的catalina.bat文件中echo Using CATALINA_BASE:   "%CATALINA_BASE%"的前一行加入如下代碼。
  • 1
  • 2

set JAVA_OPTS=%JAVA_OPTS% 
-server -Xms8192m -Xmx8192m -Xmn1890m -verbose:gc 
-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=5 -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70 -XX:CMSFullGCsBeforeCompaction=0 -Xnoclassgc -XX:SoftRefLRUPolicyMSPerMB=0

    *要把以上代碼寫在一行才能生效。* 
  • 1
  • 2

配置後系統的jvm內存運行狀況如下: 
這裏寫圖片描述

可以看到系統在內存到達2g後就會回收空閒內存,基本不會發生溢出的情況,8g的最大內存最高才用了2g,說明系統的性能還是很優越的,用戶數再增加也能在一定程度上保證系統穩定性。

四、Tomcat宕機預防

tomcat在運行一段時間後,出現無法訪問的情況,檢查內存完全正常,查看服務器端口發現大量close_wait,導致網絡阻塞,以至於無法響應無法的請求,這就是tomcat最經常發生的宕機假死現象。

(1) TCP端口狀態

  1. LISTENING狀態 
    FTP服務啓動後首先處於偵聽(LISTENING)狀態。
  2. ESTABLISHED狀態 
    ESTABLISHED的意思是建立連接。表示兩臺機器正在通信。
  3. CLOSE_WAIT 
    對方主動關閉連接或者網絡異常導致連接中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要調用close()來使得連接正確關閉。
  4. TIME_WAIT 
    我方主動調用close()斷開連接,收到對方確認後狀態變爲TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分段最大生存期),以此來確保舊的連接狀態不會對新連接產生影響。處於TIME_WAIT狀態的連接佔用的資源不會被內核釋放,所以作爲服務器,在可能的情況下,儘量不要主動斷開連接,以減少TIME_WAIT狀態造成的資源浪費。

      更詳細的TCP端口狀態請參考TCP端口狀態說明

(2) Windows系統下的TCP參數

  1. KeepAliveTime 
      KeepAliveTime的值控制系統嘗試驗證空閒連接是否仍然完好的頻率。如果該連接在一段時間內沒有活動,那麼系統會發送保持連接的信號,如果網絡正常並且接收方是活動的,它就會響應。如果需要對丟失接收方的情況敏感,也就是說需要更快地發現是否丟失了接收方,請考慮減小該值。而如果長期不活動的空閒連接的出現次數較多,但丟失接收方的情況出現較少,那麼可能需要增大該值以減少開銷。 
      缺省情況下,如果空閒連接在7200000毫秒(2小時)內沒有活動,系統就會發送保持連接的消息。
  2. KeepAliveInterval 
      KeepAliveInterval的值表示未收到另一方對“保持連接”信號的響應時,系統重複發送“保持連接”信號的頻率。在無任何響應的情況下,連續發送“保持連接”信號的次數超過TcpMaxDataRetransmissions(下文將介紹)的值時,將放棄該連接。如果網絡環境較差,允許較長的響應時間,則考慮增大該值以減少開銷;如果需要儘快驗證是否已丟失接收方,則考慮減小該值或TcpMaxDataRetransmissions值。 
      缺省情況下,在未收到響應而重新發送“保持連接”的信號之前,系統會等待1000毫秒(1秒)。
  3. KeepAliveInterval 
      KeepAliveInterval的值表示未收到另一方對“保持連接”信號的響應時,系統重複發送“保持連接”信號的頻率。在無任何響應的情況下,連續發送“保持連接”信號的次數超過TcpMaxDataRetransmissions(下文將介紹)的值時,將放棄該連接。如果網絡環境較差,允許較長的響應時間,則考慮增大該值以減少開銷;如果需要儘快驗證是否已丟失接收方,則考慮減小該值或TcpMaxDataRetransmissions值。 
      缺省情況下,在未收到響應而重新發送“保持連接”的信號之前,系統會等待1000毫秒(1秒)。

      更多系統參數請參考Windows系統下的TCP參數

(3) tomcat假死分析及預防

close_wait發生的原因是TCP連接沒有調用關閉方法,需要應用來處理網絡鏈接關閉,對於Web請求出現這個原因,經常是因爲Response的BodyStream沒有調用Close,除了調整代碼外,可以調整windows系統參數解決tomcat假死問題

tomcat假死時利用netstat -ano查看端口現象如下: 
這裏寫圖片描述 
KeepLive在Windows操作系統下默認是7200000毫秒,也就是2個小時才清理一次,對與大量close_wait情況下,可以減小其時間 
在註冊表的[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]改動或創建以下項 
“KeepAliveTime”=dword:afc8 (45000毫秒) 
“KeepAliveInterval”=dword:1 
“TcpMaxDataRetransmissions”=dword:”5″ 
情況會明顯改善,但不保證大併發下服務器不會出現假死現象,畢竟代碼的規範性也佔很大比重。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章