java 调优参数 newRatio, survivorRatio
-XX:NewRatio
新生代(Eden + 2*S)與老年代(不包括永久區(qū))的比值;要求比較的搞得吞吐量(避免較多的fullGC)
4 表示新生代 :老年代 = 1:4 ,意思是老年代占 4/5?
-XX:SurvivorRatio
2個Survivor區(qū)和Eden區(qū)的比值
8 表示 兩個Survivor : Eden = 2: 8 ,每個Survivor占 1/10?
主要講解如何為Web服務端程序設置合適的JVM參數(shù)。盡管不一定適合所有的案例,但是最好的GC算法是Concurrent Mark Sweep(CMS垃圾回收),特別是對于Web服務端程序。因為低延遲是非常重要的。當然,在使用CMS時,由于新生代空間(New Area)的分配,可能發(fā)生較長時間的stop-the-world現(xiàn)象,不過調(diào)整新生代空間的大小或者它和整個堆空間的比例可能解決這個問題。
指定新生代空間的大小和指定整個對堆內(nèi)存的大小同樣重要。你最好使用–XX:NewRatio來指定新生代和整個堆的大小比例,或者直接用–XX:NewSize來指定所需的新生代空間。這個配置是非常必要的,因為大部分對象都不會存活很久。在Web程序中,除了緩存數(shù)據(jù),其他多數(shù)對象都只在HttpRequest到HttpResponse期間創(chuàng)建。這個時間幾乎不會超過1秒,表示這些對象的存活時間也不會超過1秒。如果新生代空間不夠大,對象會被轉(zhuǎn)移到老年代空間,以便騰出地方給新對象使用。老年代空間(Old Area)垃圾回收的代價是比新生代空間大的多的,因此很需要設置一個充足的新生代空間。
然而,當新生代空間的大小超過一個特定的水平,程序的響應能力會被降低。因為新生代空間的垃圾回收過程,基本上是將數(shù)據(jù)從一個Survivor Area復制到另外一個(From Space和To Space)。另外,stop-the-world的現(xiàn)象在新生代空間和老年代空間執(zhí)行垃圾回收時都會發(fā)生。如果新生代空間變大,那么Survivor Area的空間也會更大,于是每次復制的數(shù)據(jù)就更多。基于這樣一種特性,我們應該通過指定不同操作系統(tǒng)中HotSpot JVM的NewRatio參數(shù)來分配合適大小的新生代空間。
表2:不同操作系統(tǒng)和配置下NewRatio的默認值
| Sparc -server | 2 |
| Sparc -client | 8 |
| x86 -server | 8 |
| x86 -client | 12 |
如果設置了NewRatio,那么整個堆空間的1/(NewRatio +1)就是新生代空間的大小。上表可以看出Sparc -server的NewRatio默認值很小,因為相比x86的操作系統(tǒng),Sparc以前更多用于高端應用,這個值就是為它們設置的。但現(xiàn)在x86操作系統(tǒng)的性能有很大提升,使用它們作為服務器已經(jīng)很普遍了。因此指定NewRatio為2或者3是更好的選擇,就和Sparc -server上的配置一樣。
另外,你還可以通過指定NewSize和MaxNewSize來代替NewRatio。那么新生代空間創(chuàng)建時的大小就是指定的NewSize,隨后可以一直增長到MaxNewSize的值。Eden(新創(chuàng)建對象存放的區(qū)域)和Survivor Area兩個區(qū)域會隨比例增加。就和你為-Xms(譯者注:原文是-Xs,應該是筆誤)和-Xmx設置相同的值一樣,將MaxSize和 MaxNewSize設置為相同的也是一個好選擇。
如果同時指定了NewRatio和NewSize,你應該使用更大的那個。于是,當堆空間被創(chuàng)建時,你可以用過下面的表達式計算初始新生代空間的大小:
| 1 | min(MaxNewSize, max(NewSize, heap/(NewRatio+1))) |
無論如何,僅通過一次嘗試就找到合適的堆空間和新生代空間大小是不可能的。根據(jù)我在NHN運行Web服務器的經(jīng)驗,建議使用下面的JVM參數(shù)來運行Java程序。監(jiān)控在這些參數(shù)的條件下程序的性能表現(xiàn)之后,你就能夠選擇更合適的GC算法或者配置。
表3:推薦的JVM參數(shù)
| 運行模式 | -sever |
| 整個堆內(nèi)存大小 | 為-Xms和-Xmx設置相同的值。 |
| 新生代空間大小 | -XX:NewRatio: 2到4. -XX:NewSize=? –XX:MaxNewSize=?. 使用NewSize代替NewRatio也是可以的。 |
| 持久代空間大小 | -XX:PermSize=256m -XX:MaxPermSize=256m. 設置一個在運行中不會出現(xiàn)問題的值即可,這個參數(shù)不影響性能。 |
| GC日志 | -Xloggc:$CATALINA_BASE/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps. 記錄GC日志并不會特別地影響Java程序性能,推薦你盡可能記錄日志。 |
| GC算法 | -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75. 一般來說推薦使用這些配置,但是根據(jù)程序不同的特性,其他的也有可能更好。 |
| 發(fā)生OOM時創(chuàng)建堆內(nèi)存轉(zhuǎn)儲文件 | -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs |
| 發(fā)生OOM后的操作 | -XX:OnOutOfMemoryError=$CATALINA_HOME/bin/stop.sh 或 -XX:OnOutOfMemoryError=$CATALINA_HOME/bin/restart.sh. 記錄內(nèi)存轉(zhuǎn)儲文件后,為了管理的需要執(zhí)行一個合適的操作。 |
?
總結
以上是生活随笔為你收集整理的java 调优参数 newRatio, survivorRatio的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: table: github.com/as
- 下一篇: 手动写sonar plugin 一直Fi