JVM性能優化參數說明

堆大小設置

    年輕代的設置很關鍵

    JVM中最大堆大小有三方面限制:相關操作系統的數據模型(32-bit 還是64-bit)限制;系統的可用虛擬內存限制;系統的可用物理內存限制。32位系統下,一般限制在1.5G~2G;64位操作系統對內存無限制。在Windows Server 2003系統,3.5G物理內存,JDK5.0下測試,最大可設置爲1478m。

     **典型設置**:

             java -Xmx3550m  -Xms3550m -Xmn2g  -Xss128k

      -Xmx3550m:設置JVM最大可用內存爲3550m。

      -Xms3550m:設置JVM初始內存爲3550m。此值可以設置與 -Xmx 相同,以避免每次垃圾回收完成後JVM重新分配內存。

      -Xmn2g:設置年輕代大小爲2G。整個堆大小=年輕代大小+年老代大小+持久代大小。持久代一般固定大小爲64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

      -Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256k。根據應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

     java  -Xmx3550m  -Xms3550m  -Xss128k  -XX:NewRatio=4  -XX:SurvivorRatio=4  -XX:MaxPermSize=16m  -XX:MaxTenuringThreshold=0

     -XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5。

     -XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6。

     -XX:MaxPermSize=16m:設置持久代大小爲16m。

     -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置爲0的話,則年輕代對象不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果此值設置爲一個較大值,則年輕代對象會在Survivor區進行多次複製,這樣可以增加對象在年輕代的存活時間,增加在年輕代被回收的概率。



     **回收器選擇**

     JVM給了三種選擇:串行收集器、並行收集器、併發收集器,但是串行收集器只適用於小數據量的情況,所以這裏的選擇主要針對並行收集器和併發收集器。默認情況下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啓動的時候加入相應參數。JDK5.0以後,JVM會根據當前系統配置進行判斷。

    吞吐量優先的並行收集器

    如上文所述,並行收集器主要以到達一定的吞吐量爲目標,適用於科學計算和後臺處理等。

    **典型配置**:

        java  -Xmx3800m  -Xms3800m  -Xmn2g  -Xss128k  -XX:+UseParallelGC  -XX:ParallelGCThreads=20

      -XX:+UseParallelGC:選擇垃圾收集器爲並行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用併發收集,而年老代仍舊使用串行收集。

      -XX:+ParallelGCThreads=20:配置並行收集器的線程數,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數目相等。



        java  -Xmx3550m  -Xms3550m  -Xmn2g  -Xss128k  -XX:+UseParallelGC  -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

      -XX:+UseParallelOldGC:配置年老代垃圾收集方式爲並行收集。JDK6.0支持對年老代並行收集。



        java  -Xmx3550m  -Xms3550m  -Xmn2g  -Xss128k  -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100

       -XX:MaxGCPauseMillis=100:設置每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。



        java  -Xmx3550m  -Xms3550m  -Xmn2g  -Xss128k  -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100  -XX:+UseAdaptiveSizePolicy

       -XX:+UseAdaptiveSizePolicy:設置此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低響應時間或者收集頻率等,此值建議使用並行收集器時,一直打開。 



    **響應時間優先的併發收集器**

    如上文所述,併發收集器主要是保證系統的響應時間,減少垃圾收集時的停頓時間。適用於應用服務器、電信領域等。

    典型配置:

    java  -Xmx3550m  -Xms3550  -Xmn2g  -Xss128k  -XX:ParallelGCThreads=20  -XX:+UseConcMarkSweepGC  -XX:+UseParNewGC

    -XX:+UseConcMarkSweepGC:設置年老代爲併發收集。測試中配置這個以後,-XX:NewRatio=4的配置失效了,原因不明。所以,此時年輕代大小最好用-Xmn設置。

    -XX:+UseParNewGC:設置年輕代爲並行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,所以無需再設置此值。



    java  -Xmx3550m  -Xms3550  -Xmn2g  -Xss128k  -XX:+UseConcMarkSweepGC  -XX:CMSFullGCsBeforeCompaction=5  -XX:+UseCMSCompactAtFullCollection 

    -XX:CMSFullGCsBeforeCompaction:由於併發收集器不對內存空間進行壓縮、整理,所以運行一段時間後會產生“碎片”,使得運行效率降低。此值設置運行多少次GC以後對內存空間進行壓縮、整理。

    -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片。



   **常見配置彙總**

   堆設置

       -Xms:初始堆大小

       -Xmx:最大堆大小

       -XX:NewSize=n:設置年輕代大小

       -XX:NewRatio=n:設置年輕代和年老代的比值。如:爲3,表示年輕代與年老代比值爲1:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5。

       -XX:MaxPermSize=n:設置持久代大小

    **收集器設置**

       -XX:+UseSerialGC:設置串行收集器

       -XX:+UseParallelGC:設置並行收集器

       -XX:+UseParalledlOldGC:設置並行年老代收集器

       -XX:+UseConcMarkSweepGC:設置併發收集器

    垃圾回收統計信息

       -XX:+PrintGC

       -XX:+PrintGCDetails

       -XX:+PrintGCTimeStamps

       -Xloggc:filename

     並行收集器設置

       -XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。

       -XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間

       -XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+N)

     併發收集器設置

       -XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU情況。

       -XX:+ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章