實戰Java虛擬機器之二“虛擬機器的工作模式”

來源:互聯網
上載者:User

標籤:jvm   java   效能最佳化   

今天開始實戰Java虛擬機器之二:“虛擬機器的工作模式”。

總計有5個系列

  • 實戰Java虛擬機器之一“堆溢出處理”

  • 實戰Java虛擬機器之二“虛擬機器的工作模式”

  • 實戰Java虛擬機器之三“G1的新生代GC”

  • 實戰Java虛擬機器之四“禁用System.gc()”

  • 實戰Java虛擬機器之五“開啟JIT編譯”

目前的Java虛擬機器支援Client和Server兩種運行模式。使用參數-client可以指定使用Client模式,使用參數-server可以指定使用Server模式。預設情況下,虛擬機器會根據當前電腦系統內容自動選擇運行模式。使用-version參數可以查看當前的模式,如下所示:

  1. ./java -version  

  2. java version "1.7.0_40"  

  3. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  

  4. Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)  


使用-server參數後,就可以得到如下輸出:


  1. ./java -server -version  

  2. java version "1.7.0_40"  

  3. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  

  4. Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)  


與Client模式相比,Server模式的啟動比較慢,因為Server模式會嘗試收集更多的系統效能資訊,使用更複雜的最佳化演算法對程式進行最佳化。因此,當系統完全啟動並進入運行穩定期後,Server模式的執行速度會遠遠快於Client模式。所以,對於後台長期啟動並執行系統,使用-server參數啟動對系統的整體效能可以有不小的協助。但對於使用者介面程式,已耗用時間不長,又追求啟動速度,Client模式也是不錯的選擇。


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

虛擬機器在Server模式和Client模式下的各種參數可能會有很大不同,讀者如果需要查看給定參數的預設值,可以使用-XX:+PrintFlagsFinal參數。這裡以JIT編譯閾值和最大堆為例,展示Client模式和Server模式下兩者的區別。

對於Client模式,參數如下:


  1. ./java -XX:+PrintFlagsFinal -client -version  |grep -E ‘ CompileThreshold| MaxHeapSize‘  

  2.      intx CompileThreshold                          = 1500            {pd product}  

  3.     uintx MaxHeapSize                              := 268435456       {product}  

  4. java version "1.7.0_40"  

  5. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  

  6. Java HotSpot(TM) Client VM (build 24.0-b56, mixedmode, sharing)  

對於Server模式,參數如下:

  1. ./java -XX:+PrintFlagsFinal -server -version  |grep -E ‘ CompileThreshold| MaxHeapSize‘  

  2.      intx CompileThreshold                          = 10000           {pd product}  

  3.     uintx MaxHeapSize                              :=1073741824      {product}  

  4. java version "1.7.0_40"  

  5. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  

  6. Java HotSpot(TM) Server VM (build 24.0-b56, mixedmode)  


可以看到,在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編譯”

節選自

650) this.width=650;" src="http://www.uucode.net/wp-content/uploads/2015/03/25612fm%E7%AB%8B%E4%BD%93%E5%9B%BE-228x300.jpg" style="border:none;" />


實戰Java虛擬機器之二“虛擬機器的工作模式”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.