JVM Client和Server端有什么區(qū)別
java -version 命令大家都用過,大部分就是看下jdk版本或檢查下環(huán)境變量的設(shè)置,但最后一行的信息也挺重要,如下圖所示:

Server VM表示我們的虛擬機(jī)類型,mixed mode表示虛擬機(jī)以混合模式工作。
一. 虛擬機(jī)
先說(shuō)下本篇文章的內(nèi)容都是基于HotSpot虛擬機(jī)。
我們熟知的Java虛擬機(jī)是一種規(guī)范標(biāo)準(zhǔn),有多種實(shí)現(xiàn),比如HotSpot虛擬機(jī)就是JVM的一種實(shí)現(xiàn),也是目前使用范圍最廣的Java虛擬機(jī)。其實(shí)HotSpot最早也不是Sun開發(fā)的,是他早期收購(gòu)的一家公司開發(fā)的,后來(lái)Sun把JDK開源后,OpenJDK誕生了,所以HotSpot成了這兩個(gè)JDK共用的虛擬機(jī)。
除了HotSpot虛擬機(jī),Oracle原來(lái)的JRockit VM也是Java虛擬機(jī)的實(shí)現(xiàn)(后面會(huì)把HotSpot和JRockit整合),還有IBM也有對(duì)應(yīng)的VM實(shí)現(xiàn)。
為什么叫HotSpot虛擬機(jī)?
如同它的名字,它的特點(diǎn)就是熱點(diǎn)代碼探測(cè)技術(shù),這個(gè)技術(shù)可以通過執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼,然后通過JIT即時(shí)編譯成機(jī)器碼并緩存起來(lái),提高執(zhí)行效率。
而JIT編譯只是一種概念,HotSpot內(nèi)置C1,C2這兩種編譯器實(shí)現(xiàn):
C1:編譯時(shí)間短,優(yōu)化策略簡(jiǎn)單C2:編譯時(shí)間長(zhǎng),優(yōu)化策略復(fù)雜
C1,C2都屬于JIT編譯技術(shù),是JIT的不同實(shí)現(xiàn)
二. 虛擬機(jī)類型client server的區(qū)別
HotSpot虛擬機(jī)分client端和server端,準(zhǔn)確的說(shuō)應(yīng)該是分兩種類型,因?yàn)閏lient,server VM是兩種適用不同業(yè)務(wù)場(chǎng)景的虛擬機(jī)類型。
- client VM 使用的是C1編譯器
- server VM 使用的是C2編譯器
在第一張圖中圈出的Server VM使用的就是C2編譯器。
所以clientserver最大的區(qū)別就是C1和C2的區(qū)別,主要體現(xiàn)在編譯策略上:
- Client啟動(dòng)快,內(nèi)存占用少,編譯快,針對(duì)桌面應(yīng)用程序優(yōu)化(比如GUI),為在客戶端環(huán)境中減少啟動(dòng)時(shí)間而優(yōu)化
- Server啟動(dòng)慢,但是一旦運(yùn)行起來(lái)后,性能將會(huì)有很大的提升,因?yàn)榫幾g更完全,效率高,針對(duì)服務(wù)端應(yīng)用優(yōu)化
大家可以根據(jù)具體的業(yè)務(wù)場(chǎng)景選擇,不過現(xiàn)在的系統(tǒng)大部分都是B/S架構(gòu),前后端又是分離的,所以我們用的虛擬機(jī)大部分都是server類型。
網(wǎng)上有張c++和java的性能對(duì)比,如下:

可以看到最明顯的差異是JVM client端和server端關(guān)于method call方法調(diào)用上的性能對(duì)比(紅色是server VM,黃色是client VM,越高越好)。
另外client/server VM除了在編譯策略和性能上的區(qū)別外,在內(nèi)存分配和GC上也不一樣:
- client 默認(rèn)-Xms是1M,-Xmx是64M,新生代選擇的是串行g(shù)c,舊生代選擇的是串行g(shù)c
- server 默認(rèn)-Xms是128M,-Xmx是1024M,新生代選擇的是并行回收gc,舊生代選擇的是并行g(shù)c
如果需要修改HotSpot虛擬機(jī)的類型可以通過%JAVA_HOME%jrelibamd64文件夾里的jvm.cfg修改(jdk版本不一樣對(duì)應(yīng)的目錄可能不叫amd64這個(gè)名字),jvm.cfg文件內(nèi)容如下:
-server KNOWN-client IGNORE
當(dāng)該參數(shù)不指定時(shí),虛擬機(jī)啟動(dòng)檢測(cè)主機(jī)是否為服務(wù)器,如果是,則以ServerVM啟動(dòng),否則以ClientVM啟動(dòng),檢測(cè)的根據(jù)是至少2個(gè)CPU和最低2GB內(nèi)存。
還有一種切換方式是每次執(zhí)行java命令時(shí)在后面加上-client或-server的參數(shù)指定。
這里需要注意一點(diǎn):無(wú)論是哪種方式切換,都是調(diào)用對(duì)應(yīng)的jvm.dll執(zhí)行的,所以在你本地必須有client和server各自對(duì)應(yīng)的jvm.dll文件存在才行,否則無(wú)法切換虛擬機(jī)類型。
三.虛擬機(jī)工作模式
第一張圖里的最后一個(gè)圈出的mixed mode表示虛擬機(jī)的工作模式為混合模式,在命令行輸入java -X可以查看其它模式:

還有一種-Xcomp表示純編譯模式。
下面講下三種模式的區(qū)別
- -Xmixed 混合模式:mixed mode是HotSpot虛擬機(jī)的默認(rèn)工作模式,在上篇文章中講到過虛擬機(jī)執(zhí)行字節(jié)碼分兩種方式:解釋執(zhí)行和編譯執(zhí)行,編譯執(zhí)行就是JIT(C1/C2),所以混合模式就是解釋執(zhí)行+編譯執(zhí)行(根據(jù)clientVM還是serverVM類型區(qū)分使用C1還是C2編譯器),這樣就可以發(fā)揮解釋執(zhí)行和編譯執(zhí)行的優(yōu)勢(shì)。
- -Xint 解釋模式:interpreted mode,強(qiáng)制JVM以解釋方式執(zhí)行所有的字節(jié)碼
- -Xcomp 編譯模式:compiled mode,與-Xint相反,JVM在第一次使用時(shí)會(huì)把所有的字節(jié)碼編譯成本地代碼(實(shí)際我測(cè)試下來(lái)的效果并不如混合模式)
解釋模式和編譯模式的區(qū)別上篇文章也有講到,這里就不展開了
同樣工作模式也可以切換,在命令行加上-Xint或-Xcomp的參數(shù)設(shè)置:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法
本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法,有需要的朋友可以參考一下2013-04-04
SpringBoot多環(huán)境開發(fā)與日志小結(jié)
這篇文章主要介紹了SpringBoot多環(huán)境開發(fā)與日志,下面給大家說(shuō)一下如何基于多環(huán)境開發(fā)做配置獨(dú)立管理,務(wù)必掌握,需要的朋友可以參考下2022-08-08
MyBatis?詳細(xì)講解動(dòng)態(tài)?SQL的使用
動(dòng)態(tài)?SQL?是?MyBatis?的強(qiáng)大特性之一。如果你使用過?JDBC?或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接?SQL?語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài)?SQL,可以徹底擺脫這種痛苦2022-04-04
這么設(shè)置IDEA中的Maven,再也不用擔(dān)心依賴下載失敗了
今天給大家?guī)?lái)一個(gè)IDEA中Maven設(shè)置的小技巧.這個(gè)技巧可以說(shuō)非常有用,學(xué)會(huì)設(shè)置之后,再也不用擔(dān)心maven依賴下載變慢的問題,需要的朋友可以參考下2021-05-05
java中File類的三種創(chuàng)建文件夾方法總結(jié)
這篇文章主要給大家介紹了關(guān)于java中File類的三種創(chuàng)建文件夾方法,File類代表文件或目錄路徑名的抽象表達(dá)形式,通過File類提供的方法,我們可以很方便地創(chuàng)建文件夾,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
Java異常處理Guava?Throwables類使用實(shí)例解析
這篇文章主要為大家介紹了Java異常處理神器Guava?Throwables類使用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Spring中的事務(wù)控制知識(shí)總結(jié)
我們講了轉(zhuǎn)賬方法存在著事務(wù)問題,當(dāng)在業(yè)務(wù)層方法更新轉(zhuǎn)入賬戶時(shí)發(fā)現(xiàn)異常,更新收款方賬戶則會(huì)出錯(cuò).當(dāng)時(shí)是通過自定義事務(wù)管理器進(jìn)行整體事務(wù)的處理.其實(shí)Spring 提供了業(yè)務(wù)層的事務(wù)處理解決方案,并且 Spring 的事務(wù)控制都是基于 AOP 的,需要的朋友可以參考下2021-06-06
spring boot項(xiàng)目快速構(gòu)建的全步驟
這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目快速構(gòu)建的全步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Spring mvc防止數(shù)據(jù)重復(fù)提交的方法
這篇文章主要為大家詳細(xì)介紹了Spring mvc防止數(shù)據(jù)重復(fù)提交的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

