JVM類型與模式[java -version]

本人博客原文:http://www.deleiguo.com/archives/172
轉(zhuǎn)發(fā)請附帶原文地址

簡介

基本上一開始學(xué)習(xí)Java,就接觸到第一個(gè)Java的命令:java -version
這個(gè)命令最常用的就是用來查看當(dāng)前服務(wù)器的JDK環(huán)境版本带欢,以此驗(yàn)證服務(wù)器環(huán)境變量是否已正確的設(shè)置好JDK隔盛。
最常見的結(jié)果一般有兩種:

  • Sun JDK:
delei@DeleitekiMBP:~$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
  • Open JDK:
root@ubuntu-server:~# java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.15.10.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

第一行:JDK的版本號
第二行:JDK的運(yùn)行環(huán)境

但第三行是指的什么宵距,在一開始沒留意也不理解這一行包含著哪些信息,這里以Sun JDK為例來稍微深入看一下.

Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
  • Java HotSpot(TM)

    • 這是從Sun公司開始,到Oracle后一直使用的虛擬機(jī);
    • 其實(shí)JVM只是一個(gè)規(guī)范,可以自己實(shí)現(xiàn)虛擬機(jī)式矫;
    • 目前市面上常用的商業(yè)虛擬機(jī)有:HotSpot(Oracle 和 openjdk),IBM的J9 vm,Azul Systems 的Zing等 zhihu;
    • 其他虛擬機(jī):wikipedia
  • 64-Bit

    • 如果安裝的是64位的則是64-bit,如果安裝是32位役耕,則為32-bit采转。
    • 這里不是服務(wù)器的操作系統(tǒng),而是指的當(dāng)前安裝JDK
  • Server VM

  • Server VM

  • Client VM

  • mixed mode

  • mixed mode:混合模式

  • class data sharing:類數(shù)據(jù)共享

  • interpreted mode:解釋模式


JVM類型

首先要知道的的是Server VM和Client VM可以理解是不同的虛擬機(jī)瞬痘。
如果操作系統(tǒng)是64位的故慈,只能是Server VM,Client VM只有在32位上才有框全。Oracle官方

Server VM和Client VM有什么區(qū)別察绷?在官網(wǎng)的FAQ中有如下的描述:

JIT Compiler
1.What's the difference between the -client and -server systems?

These two systems are different binaries. They are essentially two different compilers (JITs)interfacing to the same runtime system. The client system is optimal for applications which need fast startup times or small footprints, the server system is optimal for applications where the overall performance is most important. In general the client system is better suited for interactive applications such as GUIs. Some of the other differences include the compilation policy,heap defaults, and inlining policy.

大致翻譯:
這兩個(gè)JVM采用不同的編譯器。
Client JVM適合快速啟動和較小內(nèi)存的津辩,它適合強(qiáng)調(diào)交互的應(yīng)用拆撼,比如GUI(桌面級應(yīng)用界面);
Server JVM則是偏重執(zhí)行時(shí)候的效率的喘沿。
其他不同的地方"編譯策略"闸度、"默認(rèn)堆大小"、"內(nèi)嵌策略"

2.Where do I get the server and client systems?

Client and server systems are both downloaded with the 32-bit Solaris and Linux downloads. For 32-bit Windows, if you download the JRE, you get only the client, you'll need to download the SDK to get both systems.

For 64-bit, only the server system is included. On Solaris, the 64-bit JRE is an overlay on top of the 32-bit distribution. However, on Linux and Windows, it's a completely separate distribution.

主要內(nèi)容翻譯:
在32位的系統(tǒng)中摹恨,如果下載JRE,則只有client筋岛;
從Java SE 5.0開始,在64位的系統(tǒng)中晒哄,默認(rèn)的時(shí)候Server,32位的默認(rèn)

以上是從官方得到的原理/規(guī)范使用上的一些說明肪获。接下來看在實(shí)際當(dāng)中寝凌,如何切換Server VM和Client VM:

  • 想要在windows系統(tǒng)中進(jìn)行切換,需要下載JDK而不是JRE;
  • 在Windows 系統(tǒng)中孝赫,找到JDK(%JAVA_HOME%)安裝的目錄/jre/lib较木,該目錄下會有serverclient兩個(gè)不同的目錄;
  1. 命令切換(推薦)
    在CMD/終端命令中,執(zhí)行java -server -versionjava -client -version即可切換;

  2. 修改文件(永久切換)
    jre/lib/i386/(32位的JDK有i386文件夾)青柄,編輯修改jvm.cfg文件

# List of JVMs that can be used as an option to java, javac, etc.
# Order is important -- first in this list is the default JVM.
# NOTE that this both this file and its format are UNSUPPORTED and
# WILL GO AWAY in a future release.
#
# You may also select a JVM in an arbitrary location with the
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
# and may not be available in a future release.
#
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

# Order is important -- first in this list is the default JVM.
第一行的配置則為默認(rèn)的JVM伐债,這里第一行是-client,所有默認(rèn)是Client VM;
要想用Server VM致开,則將第二行與第三行調(diào)換位置保存即可;

應(yīng)用場景

  1. 我們時(shí)常會在開發(fā)/生產(chǎn)環(huán)境中對web 服務(wù)器調(diào)整JVM的參數(shù)峰锁,一般來說目前服務(wù)器都是64位的,可以先用java -version來查看環(huán)境;
  2. 根據(jù)應(yīng)用的場景需要双戳,在jvm中加上-server 參數(shù);

JVM運(yùn)行模式

在CMD/終端命令中虹蒋,執(zhí)行java -X

root@ubuntu-server:~# java -X
    -Xmixed           mixed mode execution (default)
    -Xint             interpreted mode execution only

在此可以知道m(xù)ixed是默認(rèn)的模式;
JVM模式有:-Xint, -Xcomp, 和 -Xmixed

  • ** -Xint**
    在解釋模式(interpreted mode)下,-Xint標(biāo)記會強(qiáng)制JVM執(zhí)行所有的字節(jié)碼魄衅,當(dāng)然這會降低運(yùn)行速度峭竣,通常低10倍或更多。

  • ** -Xcomp**
    -Xcomp參數(shù)與它(-Xint)正好相反晃虫,JVM在第一次使用時(shí)會把所有的字節(jié)碼編譯成本地代碼皆撩,從而帶來最大程度的優(yōu)化。這聽起來不錯(cuò)哲银,因?yàn)檫@完全繞開了緩慢的解釋器

  • -Xmixed
    混合模式(mixed mode)毅访,是JVM的默認(rèn)工作模式。它會同時(shí)使用編譯模式和解釋模式盘榨。對于字節(jié)碼中多次被調(diào)用的部分喻粹,JVM會將其編譯成本地代碼以提高執(zhí)行效率;而被調(diào)用很少(甚至只有一次)的方法在解釋模式下會繼續(xù)執(zhí)行草巡,從而減少編譯和優(yōu)化成本守呜。JIT編譯器在運(yùn)行時(shí)創(chuàng)建方法使用文件,然后一步一步的優(yōu)化每一個(gè)方法山憨,有時(shí)候會主動的優(yōu)化應(yīng)用的行為查乒。這些優(yōu)化技術(shù),比如積極的分支預(yù)測(optimistic branch prediction)郁竟,如果不先分析應(yīng)用就不能有效的使用玛迄。這樣將頻繁調(diào)用的部分提取出來,編譯成本地代碼棚亩,也就是在應(yīng)用中構(gòu)建某種熱點(diǎn)(即HotSpot蓖议,這也是HotSpot JVM名字的由來)。使用混合模式可以獲得最好的執(zhí)行效率讥蟆。

在CMD/終端命令中勒虾,可以直接通過命令來切換模式:

root@ubuntu-server:~# java -Xint -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.15.10.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, interpreted mode)

root@ubuntu-server:~# java -Xcomp -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.15.10.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, compiled mode)

** 代碼驗(yàn)證**
我們通過一個(gè)小的Java代碼來驗(yàn)證下不同mode下的執(zhí)行耗時(shí)(Server VM)

public class JVMModeTest {

    private static void test() {//循環(huán)++
        for (int i =0;i<1000000000;i++) {
        }
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        test();
        long end = System.currentTimeMillis();
        System.out.println(end-start);//打印執(zhí)行耗時(shí)
    }

}

結(jié)果如下:

root@ubuntu-server:~/work/java$ java -Xcomp JVMModeTest
2
root@ubuntu-server:~/work/java$ java -Xint JVMModeTest
28562
root@ubuntu-server:~/work/java$ java -Xmixed JVMModeTest
18

引用原文:深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐(第2版)

由于即時(shí)編譯器編譯本地代碼需要占用程序運(yùn)行時(shí)間,要編譯出優(yōu)化程度更高的代碼瘸彤,所花費(fèi)的時(shí)間可能更長修然;而且想要編譯出優(yōu)化程度更高的代碼,解釋器可能還要替編譯器收集性能監(jiān)控信息质况,這對解釋執(zhí)行的速度也有影響愕宋。為了在程序啟動響應(yīng)速度與運(yùn)行效率之間達(dá)到最佳平衡,HotSpot虛擬機(jī)還會逐漸啟用分層編譯(Tiered Compilation)[4]的策略结榄,分層編譯的概念在JDK 1.6時(shí)期出現(xiàn)中贝,后來一直處于改進(jìn)階段,最終在JDK 1.7的Server模式虛擬機(jī)中作為默認(rèn)編譯策略被開啟潭陪。分層編譯根據(jù)編譯器編譯雄妥、優(yōu)化的規(guī)模與耗時(shí)最蕾,劃分出不同的編譯層次,其中包括:

  • 第0層老厌,程序解釋執(zhí)行瘟则,解釋器不開啟性能監(jiān)控功能(Profiling),可觸發(fā)第1層編譯枝秤。

  • 第1層醋拧,也稱為C1編譯,將字節(jié)碼編譯為本地代碼淀弹,進(jìn)行簡單丹壕、可靠的優(yōu)化,如有必要將加入性能監(jiān)控的邏輯薇溃。

  • 第2層(或2層以上)菌赖,也稱為C2編譯,也是將字節(jié)碼編譯為本地代碼沐序,但是會啟用一些編譯耗時(shí)較長的優(yōu)化琉用,甚至?xí)鶕?jù)性能監(jiān)控信息進(jìn)行一些不可靠的激進(jìn)優(yōu)化。

實(shí)施分層編譯后策幼,Client Compiler和Server Compiler將會同時(shí)工作邑时,許多代碼都可能會被多次編譯,用Client Compiler獲取更高的編譯速度特姐,用Server Compiler來獲取更好的編譯質(zhì)量晶丘,在解釋執(zhí)行的時(shí)候也無須再承擔(dān)收集性能監(jiān)控信息的任務(wù)

注:
[1] 在虛擬機(jī)中習(xí)慣將Client Compiler稱為C1,將Server Compiler稱為C2唐含。


參考/引用

http://my.oschina.net/itblog/blog/507822
http://ifeve.com/useful-jvm-flags-part-1-jvm-types-and-compiler-modes-2/
深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐(第2版)

http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/server-class.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浅浮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子觉壶,更是在濱河造成了極大的恐慌脑题,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铜靶,死亡現(xiàn)場離奇詭異,居然都是意外死亡他炊,警方通過查閱死者的電腦和手機(jī)争剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痊末,“玉大人蚕苇,你說我怎么就攤上這事≡涞” “怎么了涩笤?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵嚼吞,是天一觀的道長。 經(jīng)常有香客問我蹬碧,道長舱禽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任恩沽,我火速辦了婚禮誊稚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罗心。我一直安慰自己里伯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布渤闷。 她就那樣靜靜地躺著疾瓮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飒箭。 梳的紋絲不亂的頭發(fā)上狼电,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音补憾,去河邊找鬼漫萄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盈匾,可吹牛的內(nèi)容都是我干的腾务。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼削饵,長吁一口氣:“原來是場噩夢啊……” “哼岩瘦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窿撬,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤启昧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后劈伴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體密末,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年跛璧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了严里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡追城,死狀恐怖刹碾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情座柱,我是刑警寧澤迷帜,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布物舒,位于F島的核電站,受9級特大地震影響戏锹,放射性物質(zhì)發(fā)生泄漏冠胯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一景用、第九天 我趴在偏房一處隱蔽的房頂上張望涵叮。 院中可真熱鬧,春花似錦伞插、人聲如沸割粮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舀瓢。三九已至,卻和暖如春耗美,著一層夾襖步出監(jiān)牢的瞬間京髓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工商架, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堰怨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓蛇摸,卻偏偏與公主長得像备图,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子赶袄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容