Tomcat性能優化及常用命令整理

jopen 10年前發布 | 22K 次閱讀 Tomcat 應用服務器

1.1連接參數

1.1.1默認連接配置

默認連接器采用阻塞式 IO,默認最大線程數為200,配置如下:

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true" />


1.1.2連接參數調優

可通過下面屬性配置優化默認連接器:

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true"

                               maxThreads="300" minSpareThreads="50"

maxSpareThreads="100" acceptCount="1000" />


參數解釋如下:

參數配置
</td>

參數含義
</td> </tr>

maxProcessors
</td>

Tomcat4 支持
</td> </tr>

minProcessors
</td>

Tomcat4 支持
</td> </tr>

maxThreads="300"
</td>

最大線程數
</td> </tr>

minSpareThreads="50"
</td>

初始化時創建的線程數
</td> </tr>

maxSpareThreads="100"
</td>

一旦創建的線程超過這個值, Tomcat 就會關閉不再需要的 socket線程
</td> </tr>

acceptCount="1000"
</td>

指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
</td> </tr> </tbody> </table> </div>


1.1.3非阻塞式IO配置

使用非阻塞 IO連接器,只需將上面Connector配置中的 protocol協議部分改為:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true"/>


1.2 JVM參數

1.2.1堆大小

配置堆大小參數如下:

-Xms1024m –Xmx2048m

避免由于堆內存不足導致的內存溢出。

1.2.2方法區大小

配置方法區大小參數如下:

-XX:PermSize=512m -XX:MaxPermSize=512m

避免由于加載 JarClass 過多導致的內存溢出。

1.2.3垃圾回收策略

修改新生代和老年代的 GC策略:

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled


參數解釋如下:

</tr> </tbody> </table> </div>

  
</div>

2常用命令整理


2.1 VisualVM vs. JProfiler


VisualVM是JDK自帶的性能監控工具,在JDK\bin目錄下可以找到,可以監控JVM的內存、

CPU、線程等情況,使用很方便。JProfiler是收費的性能監控工具,功能都差不多。

但這兩者只能對本地Java應用進行堆中對象的監控,遠程應用JProfiler需要部署額外的Agent,

或者將堆dump到遠程服務器上,再下載到本地用VisualVM打開來查看,不能做到實時監控。

所以有時我們還需要在遠程服務器上使用一些命令和工具進行監控。


2.2 JMap & JStat


使用JMap可以解決上面提到的問題,并通過Linux的watch命令達到實時監控的效果。

例如,通過下面命令打印堆上apache包占用內存最大的前30個對象,每一秒刷新一次:

     watch -n 1 -d "jmap -histo:live [pid] | grep "apache" | head -n 30"


輸出結果如下:

 num     #instances         #bytes  class name
----------------------------------------------
   1:        226810       34953232  <constMethodKlass>
   2:        226810       30857024  <methodKlass>
   3:         23748       25330568  <constantPoolKlass>
   4:         23748       18308832  <instanceKlassKlass>
   5:        127546       17364792  [C
   6:         18895       14344152  <constantPoolCacheKlass>
   7:         23805       13295216  [I
   8:         31302       12693272  [B
   9:        179826       10561520  <symbolKlass>
  10:        140792        4505344  java.lang.String
  11:         24852        2584608  java.lang.Class
  12:          3056        2019600  <methodDataKlass>
  13:         60750        1944000  java.util.HashMap$Entry
  14:         31562        1892608  [S
  15:         19211        1813536  [Ljava.util.HashMap$Entry;
  16:         37068        1746912  [[I
  17:         22808        1268080  [Ljava.lang.Object;
  18:         14385        1265880  java.lang.reflect.Method
  19:         18487         887376  org.apache.catalina.loader.ResourceEntry
  20:         20590         823600  java.util.LinkedHashMap$Entry
  21:          1075         627800  <objArrayKlassKlass>
  22:         12469         598512  java.util.HashMap
  23:         14416         576640  java.lang.ref.SoftReference
  24:         11032         441280  java.util.concurrent.ConcurrentHashMap$Segment


JStat可以用來查看JVM的一些統計信息,及GC的情況等。JStat命令本身支持了定時刷新功能。

     jstat -gc [pid] 2000 10


具體參數含義如下:

    jstat -class pid:顯示加載class的數量,及所占空間等信息。  
    jstat -compiler pid:顯示VM實時編譯的數量等信息。  
    jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。  
   jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。  
    jstat -gcnew pid:new對象的信息。  
    jstat -gcnewcapacity pid:new對象的信息及其占用量。  
    jstat -gcold pid:old對象的信息。  
    jstat -gcoldcapacity pid:old對象的信息及其占用量。  
    jstat -gcpermcapacity pid: perm對象的信息及其占用量。  
    jstat -util pid:統計gc信息統計。  
    jstat -printcompilation pid:當前VM執行的信息。  


2.3堆外內存查看工具


對于堆外內存的使用率,可以使用rednaxelafx做的一個工具來查看:

     https://gist.github.com/rednaxelafx/1593521


使用方法很簡單,編譯一個Java類后執行即可:

     javac -cp .:/export/servers/jdk1.6.0_25/lib/sa-jdi.jar DirectMemorySize.java
     java -cp .:/export/servers/jdk1.6.0_25/lib/sa-jdi.jar DirectMemorySize -e [pid]

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!

參數配置
</td>

參數含義
</td> </tr>

-XX:+UseParNewGC
</td>

新生代采用 ParNewGC 多線程收集器
</td> </tr>

-XX:+UseConcMarkSweepGC
</td>

老年代采用 CMS 收集器,降低 GC停頓時間
</td> </tr>

-XX:+CMSParallelRemarkEnabled
</td>

降低標記階段的停頓時間
</td> </tr>

-XX:+UseCMSCompactAtFullCollection
</td>

CMS 基于標記- 清除,會產生碎片,通過此配置在 CMS 收集后做一次壓縮整理
</td> </tr>

-XX:CMSFullGCsBeforeCompaction=0
</td>

配置多少次 CMS GC 后,做一次壓縮整理,就不用每次都做壓縮整理了
</td> </tr>

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80
</td>

當老年代使用 80 %后開始CMS 收集,默認值為 68% 。因為CMS 收集會有延遲,所以不能等到老年代占滿時再收集
</td> </tr>

-XX:+CMSClassUnloadingEnabled
</td>

允許CMS 收集方法區 (PermGen) 
JDK6 Update 3 及之前版本還需指定 -XX:+CMSPermGenSweepingEnabled參數
  • sesese色