Java虛擬機器JVM的調優參數選擇
(轉載請註明出處:Java,JavaFX,Solaris技術交流
http://developers.sun.com.cn/blog/henry/
)
在任何一個的生產系統上線前,系統效能調優(Tuning)都是很重要的一步。通常,應用系統的軟硬體的預設值都是給開發平台(或小規模系統)設計的,用
來跑生產系統幾乎都無法發揮出軟硬體的最佳效能。有時,系統調優前後的效能會差好幾倍。另一方面,由於應用程式的開發人員通常都是針對功能作開發的,因
此,開發硬體都是比生產環境要小的機器。例如,生產系統是一台8個CPU,64GB記憶體的伺服器,而程式開發伺服器可能只有1個CPU和4GB記憶體。所以,在
開發人員中常常不具備做效能方面測試的軟硬體環境。另外,有的程式員甚至在開發時都沒有考慮到多使用者並發的環境,程式中存在單點瓶頸等問題。在做壓力測試
和調優時,往往就會發現這些關鍵點。
由於應用系統是個軟硬體的完整統一體,系統調優往往需要涉及硬體、網路、作業系統、中介軟體,應用程式和資料庫等方面。在調優的過程中,往往
需要發現存在瓶頸的地方(也就是導致系統變慢的部分),分析原因,從而改進和確定較優的參數。
我們在作JVM的調優前,通常先要瞭解啟動並執行硬體平台,作業系統和中介軟體,然後針對這些情況配置相應的系統參數,在測試中不斷完善參數。由
於效能調優需要對系統非常瞭解,並且需要豐富的經驗,因此不是一件容易的事情。這裡介紹一些很好的參考資料,就是SPEC.org的網站。這是硬體廠商公
布benchmark測試結果的地方,通常硬體廠商會把系統調到最佳化才公布結果的,因此很有借鑒意義。常見和JVM有關的benchmark值主要有
SPECjAppServer2004和SPECjbb2005。前者是J2EE應用伺服器的效能指標,後者是伺服器端Java虛擬機器的效能指標。給大家
介紹這個網站的目的是說大家可以參考硬體廠商給出的JVM配置,在根據自己應用環境的特點,較快的得出較好的參數。例如,這個網頁給出了SUN公司
T5120伺服器+應用伺服器9.1 +JDK1.5的SPECjAppServer2004值是8,439.36:
http://www.spec.org/jAppServer2004/results/res2007q4/jAppServer2004-20071106-00092.html
我們現在要關心的不是Benchmark的值(註:實際上,Sun公司的這個值是個很不錯的結果),而是留意在這種環境下JVM的參數配
置,可以找到一個欄目“Notes / Tuning Information”:
(轉載請註明出處:Java,JavaFX,Solaris
技術交流
http://developers.sun.com.cn/blog/henry/
)
JVM Options: -server -XX:+AggressiveHeap
-Xmx2560m -Xms2560m -Xmn1024m -Xss128k
-XX:PermSize=256m
-XX:+DisableExplicitGC
-XX:ParallelGCThreads=24
-XX:LargePageSizeInBytes=256m
-XX:+UseParallelOldGC
-XX:+AggressiveOpts
-DAllowManagedFieldsInDefaultFetchGroup=true
-DAllowMediatedWriteInDefaultFetchGroup=true
-XX:-UseBiasedLocking
-Dcom.sun.ejb.containers.readonly.relative.refresh.mode=true
-Dcom.sun.jts.dblogging.insertquery=insert into
txn_log_table_0 values ( ? , ? , ? )
-Dcom.sun.jts.dblogging.deletequery=delete from
txn_log_table_0 where localtid = ? and servername = ?
-Dcom.sun.jdo.spi.persistence.support.sqlstore.
MULTILEVEL_PREFETCH=true
那麼上面那些參數是什麼意思呢?上述段落中“-XX”的參數是SUN JVM的擴充選項,其中以下的這些都是和記憶體回收(GC)有關:
-XX:PermSize=256m
-XX:+DisableExplicitGC
-XX:ParallelGCThreads=24
-XX:+UseParallelOldGC
-XX:+AggressiveHeap
下面這個選項是選擇大的記憶體頁面:
-XX:LargePageSizeInBytes=256m
"-XX:+AggressiveOpts"是一些實驗性最佳化參數,“-XX:-UseBiasedLocking”是非競爭性的同步選項。
而選項“-Xmx2560m -Xms2560m -Xmn1024m
-Xss128k”則是初始堆棧的記憶體值,注意-Xmx和-Xms的值是一樣的,這樣系統效能會較平穩些。
至於這些參數詳細代表什麼意義,大家可以google一下就很容易瞭解。這是Sun網站上的說明,有興趣的可以讀一下:
http://java.sun.com/performance/reference/whitepapers/tuning.html
如果你的應用系統是JDK1.5,硬體是T5120,作業系統是Solaris,那麼這些參數就很有借鑒意義。如果你的硬體系統不是
T5120,但是使用SUN的JDK1.5
,這些參數也是有一定參考作用。當然,最理想的是選擇一個和自己的環境最近似的結果來參考。大多數軟硬體的測試結果都可以在SPEC.org上找到,如果
你的系統是J2EE的3層架構,可以用jAppServer2004指標,如果是純JAVA的應用,可用jbb2005的結果:
http://www.spec.org/jAppServer2004/
http://www.spec.org/jbb2005/
需要注意的是,這些調優參數只是提供了一個思路,具體是否合適你的應用還要看實測結果。