JVM Client和Server端有什么區(qū)別
java -version 命令大家都用過,大部分就是看下jdk版本或檢查下環(huán)境變量的設(shè)置,但最后一行的信息也挺重要,如下圖所示:
Server VM表示我們的虛擬機(jī)類型,mixed mode表示虛擬機(jī)以混合模式工作。
一. 虛擬機(jī)
先說下本篇文章的內(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ā)的,是他早期收購的一家公司開發(fā)的,后來Sun把JDK開源后,OpenJDK誕生了,所以HotSpot成了這兩個(gè)JDK共用的虛擬機(jī)。
除了HotSpot虛擬機(jī),Oracle原來的JRockit VM也是Java虛擬機(jī)的實(shí)現(xiàn)(后面會把HotSpot和JRockit整合),還有IBM也有對應(yīng)的VM實(shí)現(xiàn)。
為什么叫HotSpot虛擬機(jī)?
如同它的名字,它的特點(diǎn)就是熱點(diǎn)代碼探測技術(shù),這個(gè)技術(shù)可以通過執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼,然后通過JIT即時(shí)編譯成機(jī)器碼并緩存起來,提高執(zhí)行效率。
而JIT編譯只是一種概念,HotSpot內(nèi)置C1,C2這兩種編譯器實(shí)現(xiàn):
C1:編譯時(shí)間短,優(yōu)化策略簡單C2:編譯時(shí)間長,優(yōu)化策略復(fù)雜
C1,C2都屬于JIT編譯技術(shù),是JIT的不同實(shí)現(xiàn)
二. 虛擬機(jī)類型client server的區(qū)別
HotSpot虛擬機(jī)分client端和server端,準(zhǔn)確的說應(yīng)該是分兩種類型,因?yàn)閏lient,server VM是兩種適用不同業(yè)務(wù)場景的虛擬機(jī)類型。
- client VM 使用的是C1編譯器
- server VM 使用的是C2編譯器
在第一張圖中圈出的Server VM使用的就是C2編譯器。
所以clientserver最大的區(qū)別就是C1和C2的區(qū)別,主要體現(xiàn)在編譯策略上:
- Client啟動快,內(nèi)存占用少,編譯快,針對桌面應(yīng)用程序優(yōu)化(比如GUI),為在客戶端環(huán)境中減少啟動時(shí)間而優(yōu)化
- Server啟動慢,但是一旦運(yùn)行起來后,性能將會有很大的提升,因?yàn)榫幾g更完全,效率高,針對服務(wù)端應(yīng)用優(yōu)化
大家可以根據(jù)具體的業(yè)務(wù)場景選擇,不過現(xiàn)在的系統(tǒng)大部分都是B/S架構(gòu),前后端又是分離的,所以我們用的虛擬機(jī)大部分都是server類型。
網(wǎng)上有張c++和java的性能對比,如下:
可以看到最明顯的差異是JVM client端和server端關(guān)于method call方法調(diào)用上的性能對比(紅色是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版本不一樣對應(yīng)的目錄可能不叫amd64這個(gè)名字),jvm.cfg文件內(nèi)容如下:
-server KNOWN-client IGNORE
當(dāng)該參數(shù)不指定時(shí),虛擬機(jī)啟動檢測主機(jī)是否為服務(wù)器,如果是,則以ServerVM啟動,否則以ClientVM啟動,檢測的根據(jù)是至少2個(gè)CPU和最低2GB內(nèi)存。
還有一種切換方式是每次執(zhí)行java命令時(shí)在后面加上-client或-server的參數(shù)指定。
這里需要注意一點(diǎn):無論是哪種方式切換,都是調(diào)用對應(yīng)的jvm.dll執(zhí)行的,所以在你本地必須有client和server各自對應(yīng)的jvm.dll文件存在才行,否則無法切換虛擬機(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)勢。
- -Xint 解釋模式:interpreted mode,強(qiáng)制JVM以解釋方式執(zhí)行所有的字節(jié)碼
- -Xcomp 編譯模式:compiled mode,與-Xint相反,JVM在第一次使用時(shí)會把所有的字節(jié)碼編譯成本地代碼(實(shí)際我測試下來的效果并不如混合模式)
解釋模式和編譯模式的區(qū)別上篇文章也有講到,這里就不展開了
同樣工作模式也可以切換,在命令行加上-Xint或-Xcomp的參數(shù)設(shè)置:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用ip2region獲取地理位置信息的方法
這篇文章主要介紹了SpringBoot使用ip2region獲取地理位置信息的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Java中的Unsafe在安全領(lǐng)域的使用總結(jié)和復(fù)現(xiàn)(實(shí)例詳解)
unsafe里面有很多好用的方法,比如allocateInstance可以直接創(chuàng)建實(shí)例對象,defineAnonymousClass可以創(chuàng)建一個(gè)VM匿名類(VM?Anonymous?Class),以及直接從內(nèi)存級別修改對象的值。這篇文章主要介紹了Java中的Unsafe在安全領(lǐng)域的一些應(yīng)用總結(jié)和復(fù)現(xiàn),需要的朋友可以參考下2022-03-03小議Java的源文件的聲明規(guī)則以及編程風(fēng)格
這篇文章主要介紹了小議Java的源文件的聲明規(guī)則以及編程風(fēng)格,僅給Java初學(xué)者作一個(gè)簡單的示范,需要的朋友可以參考下2015-09-09IDEA中程序包Org.Springframework.Boot不存在問題及解決
這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java實(shí)現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計(jì)并輸出每個(gè)單詞出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java實(shí)現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計(jì)并輸出每個(gè)單詞出現(xiàn)次數(shù)的方法,涉及java文件I/O操作及字符串遍歷、運(yùn)算實(shí)現(xiàn)統(tǒng)計(jì)功能相關(guān)技巧,需要的朋友可以參考下2017-07-07Spring中的@EnableConfigurationProperties使用方式以及作用詳解
這篇文章主要介紹了Spring中的@EnableConfigurationProperties使用方式以及作用詳解,使用了?@ConfigurationProperties?注解的配置類生效,將該類注入到?IOC?容器中,交由?IOC?容器進(jìn)行管理,此時(shí)則不用再配置類上加上@Component,需要的朋友可以參考下2024-01-01