Tomcat配置與優化(內存、並發、管理)與性能監控


原文鏈接:http://blog.csdn.net/xyang81/article/details/51530979

一、JVM內存配置優化

在開發當中,當一個項目比較大時,依賴的jar包通常比較多,我們都知道,在應用服務器啟動時,會將應用引用到的所有類通過ClassLoader依次全部加載到內存當中。Java的邏輯內存模型大致分為堆內存棧內存靜態內存區,也稱持久區,該區的內存不會被GC回收堆內存用於存儲類的實例、數組等引用類型數據,也就是用new生成的對象,都存放在這里,棧內存存儲局部變量(如:方法參數)靜態內存區存儲常量、靜態變量、類元數據信息(方法、屬性等)。開發當中常遇到的三類內存溢出異常:

  • java.lang.OutOfMemoryError: Java heap space異常 
    表示堆內存空間滿了,如果不是程序邏輯的bug,可能是因為項目中引用的jar比較多,導到內存溢出。JVM默認堆的最小使用內存為物理內存的1/64,最大使用內存為物理內存的1/4,如8G的物理內存,JVM默認堆的最小和最大內存分別為128m和2048m。通過調整JVM的-Xms(初始內存)和-Xmx(最大內存)兩個參數加大內存使用限制。
  • java.lang.OutOfMemoryError: PermGen space異常 
    表示靜態內存區滿了,通常是由於加載的類過多導致。jdk8以下版本通過修改JVM的-XX:PermSize和-XX:MaxPermSize兩個參數,限制靜態區最小和最大內存范圍。jdk8改變了內存模型,將類定義存放到了元數據(MetaspaceSize)空間,而元數據空間是與堆空間共享同一塊內存區域的,所以在JDK8以后版本不會存在PermGen space異常了,故不用設置此參數。
  • java.lang.StackOverflowError異常 
    表示棧內存溢出。通常是由於死循環、無限遞歸導致。

修改Tomcat的內存配置,打開$TOMCAT_HOME/bin/catalina.sh文件(Windows系統是catalina.bat文件),大楖在250行左右,在JAVA_OPTS參數上添加內存參數設置即可。完整的JVM參數設置如下所示:

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless=true"

 

-server參數表示以服務模式啟動,啟動速度會稍微慢一點,但性能會高很多。不加這個參數,默認是以客戶端模式啟動。 

-Xms–Xmx JVM內存設置,建議設置成同一個值,可以在命令行中使用 java -Xmx1500m -version 來測試當前服務器可以設置的最大內存。(-Xmx 的值太大時,JVM 無法啟動)
 
-Xmn 年輕代 整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m。
 
-Xss 是指設定每個線程的堆棧大小。一般不超過 1M。
 
-XX:+AggressiveOpts 根據 JDK 的不同而采用不同的優化策略。
 
-XX:+UseBiasedLocking 優化線程鎖。
 
-XX:PermSize=128M-XX:MaxPermSize=256M 非堆內存初始值和最大值。 默認值為物理內存的 1/64 和 1/4。
 
-XX:+DisableExplicitGC 控制程序代碼中不允許顯示調用 System.gc()。
 
-XX:+UseParNewGC 對年輕代采用多線程並行回收,這樣收得快。
 
-XX:+UseConcMarkSweepGC 使用更好的 GC 技術。
 
-XX:+CMSParallelRemarkEnabled 在使用UseParNewGC 的情況下, 盡量減少 mark 的時間
 
-XX:+UseCMSCompactAtFullCollection 減少 Memory 碎片。
 
-XX:LargePageSizeInBytes 指定 Java heap 的分頁頁面大小
 
-XX:+UseFastAccessorMethods get,set 方法轉成本地代碼
 
-XX:+UseCMSInitiatingOccupancyOnly 指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 啟動收集
 
-XX:CMSInitiatingOccupancyFraction=70 年老代到 70% 滿的時候開始執行對年老代的並發垃圾回收((Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn)
 
-Djava.awt.headless=true 解決圖片在 Linux 上無法顯示圖片的問題。如生成驗證碼,含義是當前使用的是沒有安裝圖安裝圖形界面的服務器,應用中如果獲取系統顯示有關參數會拋異常,可通過jmap -heap proccess_id查看設置是否成功。 

JAVA_OPTS參數設置

也可以參考這篇文章,Tomcat配置JVM參數

二、tomcat並發配置優化

主要配置Tomcat能處理的請求數,當一個進程的線程數超過500個的話,那么這個進程的運行效率就很低了。表面上看線程越多處理的請求越多,其實過多的線程會占用CPU在不同線程之間切換的資源,導致CPU在每個線程上處理的時間片極期有限,反而會降低服務器的響應性能。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" 

                maxThreads="500"
                minSpareThreads="100"
                maxSpareThreads="200"
                acceptCount="200"
                maxIdleTime="30000"
                enableLookups="false"
               />

Tomcat的並發請求處理數量=maxThreads + acceptCount

protocol:啟用APR連接模式,提高異步IO處理性能。啟用配置請參考:《開啟Tomcat APR運行模式,優化並發性能》 
maxThreads:最大能接受的請求數,默認為200 
minSpareThreads:最少備用線程數,默認初始化,默認為25 
maxSpareThreads:最多備用線程數,一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程 
acceptCount:等待處理的請求隊列,默認為100,超過隊列長度,服務器則拒絕客戶端請求,直接返回403 
maxIdleTime:如果一個線程在30秒以內沒有活躍,則終止運行並從線程池中移除。除非線程池數量小於或等於minSpareThreads數量。默認值是1分鍾 
enableLookups:如果為true,調用request.getRemoteHost會執行DNS反查,反向解析IP對應的域名或主機,效率較低,建議設為false。 
更多參數設置,請參考Tomcat官方文檔:http://tomcat.apache.org/tomcat-8.0-doc/config/http.html

三、管理員配置

Tomcat默認沒有配置管理員帳戶的權限,如果要查看app的部署狀態、通過管理界面deploy或undeploy,則需要在tomcat-user.xml中配置具有管理權限登錄的用戶。

<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui,manager-status,manager-script,manager-jmx"/>

四、Tomcat 性能檢測

VisualVM監控( JDK 自帶)
推薦使用。
內存分析,CPU 分析,線程分析等。
 
LambdaProbe監控
需要打成 war 放入 tomcat webapp 目錄下。
 
JProfiler監控
商業的主要用於檢查和跟蹤系統的性能的工具。需要在服務器端安裝 JProfiler 軟件。

Tomcat官網配置:http://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM