1. 程式人生 > 實用技巧 >Java虛擬機器:十、Client模式和Server模式的區別

Java虛擬機器:十、Client模式和Server模式的區別

部分商用虛擬機器中,Java程式最初是通過直譯器對.class檔案進行解釋執行的,當虛擬機發現某個方法或程式碼塊執行地特別頻繁的時候,就會把這些程式碼認定為熱點程式碼Hot Spot Code(這也是我們使用的虛擬機器HotSpot名稱的由來)。為了提高熱點程式碼的執行效率,在執行時,虛擬機器將會把這些程式碼編譯成與本地平臺相關的機器碼,並進行各種層次的優化,完成這個任務的編譯器叫做即時編譯器(Just In Time Compiler,即JIT編譯器)。JIT編譯器並不是虛擬機器必需的部分,Java虛擬機器規範並沒有要求要有JIT編譯器的存在,更沒有限定或指導JIT編譯器應該如何去實現。但是,JIT編譯器效能的好壞、程式碼優化程度的高低卻是衡量一款商用虛擬機器優秀與否的最關鍵指標之一。

直譯器和編譯器其實和編譯器各有優勢:

1、當程式需要迅速啟動和執行的時候,直譯器可以先發揮作用,省去編譯的時間,立即執行

2、在程式執行後,隨著時間的推移,編譯器逐漸發揮作用,把越來越多的程式碼編譯成原生代碼之後,可以獲取更高的執行效率

我們使用的HotSpot中內建了兩個JIT編譯器,即C1編譯器和C2編譯器,預設採用的是直譯器和一個編輯器配合的方式進行工作。HotSpot在啟動的時候會根據自身版本以及宿主機器的硬體效能自動選擇執行模式,比如會檢測宿主機器是否為伺服器、比如J2SE會檢測主機是否有至少2個CPU和至少2GB的記憶體。

1、如果是,則虛擬機器會以Server模式執行,該模式與C2編譯器共同執行,更注重編譯的質量,啟動速度慢,但是執行效率高,適合用在伺服器環境下,針對生產環境進行了優化

2、如果不是,則虛擬機器會以Client模式執行,該模式與C1編譯器共同執行,更注重編譯的速度,啟動速度快,更適合用在客戶端的版本下,針對GUI進行了優化

有兩種方法檢視虛擬機器是執行在Client模式下還是Server模式下:

1、在程式命令列執行“java -version”命令,檢視的是你本地安裝的虛擬機器是資訊

2、比如我們用Eclipse或者MyEclipse執行程式,一般使用的都是工具自帶的JRE,虛擬機器並不是本地安裝的虛擬機器。這時候怎麼辦呢,可以通過在程式中執行下面的語句來檢視虛擬機器資訊

System.out.println(System.getProperty("java.vm.name"));

我這裡的執行結果是

Java HotSpot(TM) 64-Bit Server VM

當然要改變虛擬機器執行的模式也可以,只需要改jvm.cfg就可以了。我們可以從以下幾個地方找到jvm.cfg:

1、32位的JDK的檔案路徑是 JAVA_HOME/jre/lib/i386/jvm.cfg

2、64位的JDK的檔案路徑是 JAVA_HOME/jre/lib/amd64/jvm.cfg

3、MyEclipse在 .../Common/binary/com.sun.java.jdk.win32.x86_64_1.6.0.013/jre/lib/amd64/jvm.cfg

目前64位只支援Server模式,檔案內容都是一樣的,上面的註釋不去管它,剩下的就是這些:

-server KNOWN
-client IGNORE
-hotspot ALIASED_TO -server
-classic WARN
-native ERROR
-green ERROR

由於我的電腦裝的是64位JDK,所以是“-client INGORE”。同時支援Server模式和Client模式的,應該是“-server KNOWN”和“-client KNOWN”,一般只需要變更這兩個配置的先後順序即可,但是前提是JAVA_HOME/jre/bin目錄下同時存在server和client兩個資料夾,分別對應著各自的虛擬機器,缺少一個,切換後就會報錯。

轉載地址:https://www.cnblogs.com/haitaofeiyang/p/8336867.html