實戰Java虛擬機之二:「虛擬機的工做模式」

今天開始實戰Java虛擬機之二:「虛擬機的工做模式」。java

總計有5個系列算法

目前的Java虛擬機支持Client和Server兩種運行模式。使用參數-client能夠指定使用Client模式,使用參數-server能夠指定使用Server模式。默認狀況下,虛擬機會根據當前計算機系統環境自動選擇運行模式。使用-version參數能夠查看當前的模式,以下所示:ui

./java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)

使用-server參數後,就能夠獲得以下輸出:spa

./java -server -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)

與Client模式相比,Server模式的啓動比較慢,由於Server模式會嘗試收集更多的系統性能信息,使用更復雜的優化算法對程序進行優化。所以,當系統徹底啓動並進入運行穩按期後,Server模式的執行速度會遠遠快於Client模式。因此,對於後臺長期運行的系統,使用-server參數啓動對系統的總體性能能夠有不小的幫助。但對於用戶界面程序,運行時間不長,又追求啓動速度,Client模式也是不錯的選擇。
.net

從發展趨勢上看,將來64位系統必然會逐步取代32位系統,而在64位系統中虛擬機更傾向於Server模式運行。

虛擬機在Server模式和Client模式下的各類參數可能會有很大不一樣,讀者若是須要查看給定參數的默認值,可使用-XX:+PrintFlagsFinal參數。這裏以JIT編譯閾值和最大堆爲例,展現Client模式和Server模式下二者的區別。

對於Client模式,參數以下:

./java -XX:+PrintFlagsFinal -client -version  |grep -E ' CompileThreshold| MaxHeapSize'
     intx CompileThreshold                          = 1500            {pd product}
    uintx MaxHeapSize                              := 268435456       {product}
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)

對於Server模式,參數以下:

./java -XX:+PrintFlagsFinal -server -version  |grep -E ' CompileThreshold| MaxHeapSize'
     intx CompileThreshold                          = 10000           {pd product}
    uintx MaxHeapSize                              := 1073741824      {product}
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)

     能夠看到,在Client模式下,CompileThreshold默認值爲1500,即函數被調用1500次後,會進行JIT編譯(有關JIT編譯的更多細節請參閱《實戰Java虛擬機-jvm故障診斷與性能優化》第11章)。而在Server模式下,這個數值爲10000。所以,Server模式下系統更有可能解釋執行。而一旦進行編譯,Server模式的優化效果會好於Client模式。其次,對於系統最大堆,在Client模式下爲約256M,而在Server模式下約爲1G。對於其餘參數,讀者可使用相似的方式進行查找比較。

  • 實戰Java虛擬機之一「堆溢出處理」

  • 實戰Java虛擬機之二「虛擬機的工做模式」

  • 實戰Java虛擬機之三「G1的新生代GC」

  • 實戰Java虛擬機之四「禁用System.gc()」

  • 實戰Java虛擬機之五「開啓JIT編譯」

節選自

《實戰Java虛擬機》一書Q交流羣:397196583

相關文章
相關標籤/搜索