JVM client模式和Server模式區別
JVM Server模式與client模式啟動,最主要的差別在於:-Server模式啟動時,速度較慢,但是一旦運行起來後,性能將會有很大的提升。
JVM工作在Server模式下可以大大提高性能,Server模式下應用的啟動速度會比client模式慢大概10%,但運行速度比Client VM要快至少有10倍
當不指定運行模式參數時,虛擬機啟動檢測主機是否為服務器,如果是,則以Server模式啟動,否則以client模式啟動,J2SE5.0檢測的根據是至少2個CPU和最低2GB內存
由於服務器的CPU、內存和硬盤都比客戶端機器強大,所以程序部署後,都應該以server模式啟動,獲取較好的性能;
JVM在client模式默認-Xms是1M,-Xmx是64M;JVM在Server模式默認-Xms是128M,-Xmx是1024M;
server:啟動慢,編譯更完全,編譯器是自適應編譯器,效率高,針對服務端應用優化,在服務器環境中最大化程序執行速度而設計。
client:快速啟動,內存佔用少,編譯快,針對桌面應用程序優化,為在客戶端環境中減少啟動時間而優化;
當JVM用於啟動GUI界面的交互應用時適合於使用client模式,當JVM用於運行服務器後台程序時建議用Server模式。
我們可以通過運行:java -version來查看jvm默認工作在什麼模式。
關於圖一中的GCC
clien模式下,新生代選擇的是串行gc,舊生代選擇的是串行gc
server模式下,新生代選擇的是並行回收gc,舊生代選擇的是並行gc
一般來說我們系統應用選擇有兩種方式:吞吐量優先和暫停時間優先,對於吞吐量優先的採用server默認的並行gc方式,對於暫停時間優先的選用並發gc(CMS)方式。
其它延伸知識點
JDK有兩種VM,VM客戶端,VM服務器應用程序。這兩種解決方案分享java運行環境的熱點代碼庫,但使用不同的編譯器,適用於客戶機和服務器的獨特的性能特點,這些差異包括編寫內聯政策和堆的默認值。
雖然服務器和客戶端虛擬機類似,服務器VM已專門調整最大峰值操作速度。它的目的是執行長時間運行的服務器應用程序,它需要最快的運行速度超過一個快速啟動時間或較小的運行時內存佔用。
客戶VM編譯器是經典的虛擬機和實時升級(JIT)通過JDK的先前版本使用的編譯器。客戶端虛擬機提供了改進的運行應用程序和小程序的性能。 java虛擬機的熱點客戶已減少應用程序的啟動時間和內存佔用特別調整,使其特別適合客戶環境。在一般情況下,客戶端系統更好的圖形用戶界面。
因此,真正的區別也在編譯器級別上:
客戶端虛擬機編譯器不嘗試執行由編譯器在服務器虛擬機上執行的更複雜的優化,但在交換過程中,它需要較少的時間來分析和編譯一段代碼。這意味著客戶端虛擬機可以更快地啟動,並需要一個較小的內存佔用。
服務器虛擬機包含一個先進的自適應編譯器支持許多C++編譯器的優化進行優化,同樣的類型,以及一些優化,不能用傳統的編譯器完成的,比如積極的內聯在虛擬方法調用。這是一個競爭和性能優勢,靜態編譯器。自適應優化技術在它的方法是非常靈活的,通常優於甚至先進的靜態分析和編譯技術。
-Server模式啟動時,速度較慢,但是一旦運行起來後,性能將會有很大的提升,原因是:當虛擬機在-Client模式的時候,使用的是一個代號為C1的輕量級編譯器,而-Server模式啟動的虛擬機採用相對重量級代號為C2的編譯器,C2比C1編譯器編譯的相對徹底,服務起來之後,性能高。
一般只要變更-server KNOWN與-client KNOWN兩個配置的先後順序即可,前提是JAVA_HOME/jre/bin目錄下同時存在server和client兩個文件夾,分別對應各自的jvm
說了這麼多其實總結成一句話就是:
JVM Server模式下應用啟動慢但運行速度快,JVM Client模式下應用啟動快但運行速度要慢些
推薦:服務器上請以Server模式運行,面客戶端或GUI模式下就以Client模式運行