1. 程式人生 > 程式設計 >JVM Client和Server端有什麼區別

JVM Client和Server端有什麼區別

java -version 命令大家都用過,大部分就是看下jdk版本或檢查下環境變數的設定,但最後一行的資訊也挺重要,如下圖所示:

JVM Client和Server端有什麼區別

Server VM表示我們的虛擬機器型別,mixed mode表示虛擬機器以混合模式工作。

一. 虛擬機器

先說下本篇文章的內容都是基於HotSpot虛擬機器。

我們熟知的Java虛擬機器是一種規範標準,有多種實現,比如HotSpot虛擬機器就是JVM的一種實現,也是目前使用範圍最廣的Java虛擬機器。其實HotSpot最早也不是Sun開發的,是他早期收購的一家公司開發的,後來Sun把JDK開源後,OpenJDK誕生了,所以HotSpot成了這兩個JDK共用的虛擬機器。

除了HotSpot虛擬機器,Oracle原來的JRockit VM也是Java虛擬機器的實現(後面會把HotSpot和JRockit整合),還有IBM也有對應的VM實現。

為什麼叫HotSpot虛擬機器?

如同它的名字,它的特點就是熱點程式碼探測技術,這個技術可以通過執行計數器找出最具有編譯價值的程式碼,然後通過JIT即時編譯成機器碼並快取起來,提高執行效率。

而JIT編譯只是一種概念,HotSpot內建C1,C2這兩種編譯器實現:

C1:編譯時間短,優化策略簡單C2:編譯時間長,優化策略複雜

C1,C2都屬於JIT編譯技術,是JIT的不同實現

二. 虛擬機器型別client server的區別

HotSpot虛擬機器分client端和server端,準確的說應該是分兩種型別,因為client,server VM是兩種適用不同業務場景的虛擬機器型別。

  • client VM 使用的是C1編譯器
  • server VM 使用的是C2編譯器

在第一張圖中圈出的Server VM使用的就是C2編譯器。

所以clientserver最大的區別就是C1和C2的區別,主要體現在編譯策略上:

  • Client啟動快,記憶體佔用少,編譯快,針對桌面應用程式優化(比如GUI),為在客戶端環境中減少啟動時間而優化
  • Server啟動慢,但是一旦執行起來後,效能將會有很大的提升,因為編譯更完全,效率高,針對服務端應用優化

大家可以根據具體的業務場景選擇,不過現在的系統大部分都是B/S架構,前後端又是分離的,所以我們用的虛擬機器大部分都是server型別。

網上有張c++和java的效能對比,如下:

JVM Client和Server端有什麼區別

可以看到最明顯的差異是JVM client端和server端關於method call方法呼叫上的效能對比(紅色是server VM,黃色是client VM,越高越好)。

另外client/server VM除了在編譯策略和效能上的區別外,在記憶體分配和GC上也不一樣:

  • client 預設-Xms是1M,-Xmx是64M,新生代選擇的是序列gc,舊生代選擇的是序列gc
  • server 預設-Xms是128M,-Xmx是1024M,新生代選擇的是並行回收gc,舊生代選擇的是並行gc

如果需要修改HotSpot虛擬機器的型別可以通過%JAVA_HOME%jrelibamd64資料夾裡的jvm.cfg修改(jdk版本不一樣對應的目錄可能不叫amd64這個名字),jvm.cfg檔案內容如下:

-server KNOWN-client IGNORE

當該引數不指定時,虛擬機器啟動檢測主機是否為伺服器,如果是,則以ServerVM啟動,否則以ClientVM啟動,檢測的根據是至少2個CPU和最低2GB記憶體。

還有一種切換方式是每次執行java命令時在後面加上-client或-server的引數指定。

這裡需要注意一點:無論是哪種方式切換,都是呼叫對應的jvm.dll執行的,所以在你本地必須有client和server各自對應的jvm.dll檔案存在才行,否則無法切換虛擬機器型別。

三.虛擬機器工作模式

第一張圖裡的最後一個圈出的mixed mode表示虛擬機器的工作模式為混合模式,在命令列輸入java -X可以檢視其它模式:

JVM Client和Server端有什麼區別

還有一種-Xcomp表示純編譯模式。

下面講下三種模式的區別

  • -Xmixed 混合模式:mixed mode是HotSpot虛擬機器的預設工作模式,在上篇文章中講到過虛擬機器執行位元組碼分兩種方式:解釋執行和編譯執行,編譯執行就是JIT(C1/C2),所以混合模式就是解釋執行+編譯執行(根據clientVM還是serverVM型別區分使用C1還是C2編譯器),這樣就可以發揮解釋執行和編譯執行的優勢。
  • -Xint 解釋模式:interpreted mode,強制JVM以解釋方式執行所有的位元組碼
  • -Xcomp 編譯模式:compiled mode,與-Xint相反,JVM在第一次使用時會把所有的位元組碼編譯成原生代碼(實際我測試下來的效果並不如混合模式)

解釋模式和編譯模式的區別上篇文章也有講到,這裡就不展開了

同樣工作模式也可以切換,在命令列加上-Xint或-Xcomp的引數設定:

JVM Client和Server端有什麼區別

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。