深入理解 Java 虛擬機(jī)(一)走近 Java

從今天開(kāi)始讀《深入理解 Java 虛擬機(jī)》一書(shū),并開(kāi)設(shè)了同名專題 深入理解 Java 虛擬機(jī)丽猬。計(jì)劃在 2 周內(nèi)將全書(shū)內(nèi)容概覽一遍宿饱,并會(huì)每天更新我的讀書(shū)筆記熏瞄。今天的內(nèi)容是本書(shū)的第一章脚祟,主要內(nèi)容是 Java 語(yǔ)言 和 Java 虛擬機(jī)的歷史,因?yàn)檫@部分內(nèi)容我個(gè)人沒(méi)有太多的了解强饮,也就沒(méi)法加入太多個(gè)人寫作的內(nèi)容由桌,所以本篇文篇內(nèi)容大部分是來(lái)自對(duì)原作者 周志明 博士的 《深入理解 Java 虛擬機(jī)》一書(shū)的摘抄,也在此聲明并表示對(duì)原作者的尊重。

1.1 - 概述

Java
  • 總述:Java 不僅是一門編程語(yǔ)言行您,還是一個(gè)由一系列 計(jì)算機(jī)軟件規(guī)范 形成的技術(shù)體系铭乾,這個(gè)技術(shù)體系提供了完整的用于軟件開(kāi)發(fā)和跨平臺(tái)部署的支持環(huán)境,并廣泛應(yīng)用于

    • 嵌入式系統(tǒng)娃循。
    • 移動(dòng)終端 炕檩。
    • 企業(yè)服務(wù)器 。
    • 大型機(jī)等各種場(chǎng)合捌斧。
  • 特點(diǎn):Java 能獲得如此廣泛的認(rèn)可笛质,除了它擁有一門 結(jié)構(gòu)嚴(yán)謹(jǐn)面向?qū)ο?/strong> 的編程語(yǔ)言之外捞蚂,還有須有不可忽視的有點(diǎn)妇押,主要有如下幾點(diǎn)??。

    • 它擺脫了硬件平臺(tái)的束縛姓迅,實(shí)現(xiàn)了 一次編寫敲霍,到處運(yùn)行 的越界問(wèn)題。
    • 它實(shí)現(xiàn)了 熱點(diǎn)代碼檢測(cè)運(yùn)行時(shí)編譯及優(yōu)化 丁存,這使得 Java 應(yīng)用能隨著運(yùn)行時(shí)間的增加而獲得更好的性能肩杈。
    • 它有一套完善的應(yīng)用程序接口,還有無(wú)數(shù)來(lái)自商業(yè)機(jī)構(gòu)合開(kāi)源社區(qū)的第三方類庫(kù)來(lái)幫助它實(shí)現(xiàn)各種各樣的功能柱嫌。

后面我們會(huì)一起學(xué)習(xí) Java 技術(shù)中最重要的那些特性和實(shí)現(xiàn)原理锋恬,在本篇文章中,將會(huì)重點(diǎn)介紹 Java 技術(shù)體系內(nèi)容以及 Java 的歷史编丘、現(xiàn)在和未來(lái)的發(fā)展趨勢(shì)与学。


1.2 - Java 技術(shù)體系

  • 從廣義上講,Clojure嘉抓、JRuby索守、Groovy 等運(yùn)行于 Java 虛擬機(jī)上的語(yǔ)言及其相關(guān)的程序都屬于 Java 技術(shù)體系中的一員。如果僅從傳統(tǒng)意義上來(lái)看抑片,Sun官方所定義的 Java 技術(shù)體系包括以下幾個(gè)組成部分??
    • Java 程序設(shè)計(jì)語(yǔ)言卵佛。
    • 各種硬件平臺(tái)上的 Java 虛擬機(jī)。
    • Class 文件格式敞斋。
    • Java API 類庫(kù)截汪。
    • 來(lái)自商業(yè)機(jī)構(gòu)和開(kāi)源社區(qū)的第三方 Java 類庫(kù)。
  • 我們可以將 Java 程序設(shè)計(jì)語(yǔ)言植捎、Java 虛擬機(jī)衙解、Java API 類庫(kù)這三部分統(tǒng)稱為 JDK(Java Development Kit),JDK 是用于支持 Java 程序開(kāi)發(fā)的最小環(huán)境焰枢。另外蚓峦,可以把 Java API 類庫(kù)中的 Java SE API 子集和 Java 虛擬機(jī)這兩部分統(tǒng)稱為 JRE(Java Runtime Environment)舌剂,JRE 是支持 Java 程序運(yùn)行的標(biāo)準(zhǔn)環(huán)境。
  • JVM 結(jié)構(gòu)圖如下所示 ??


    JVM 結(jié)構(gòu)圖
  • Java Language 體系圖如下所示 ??


    Java Language
  • Java 技術(shù)體系可以分為4個(gè)平臺(tái)暑椰,分別是
    1. Java Card:支持一些 Java 小程序(Applets)運(yùn)行在小內(nèi)存設(shè)備(如智能卡)上的平臺(tái)霍转。
    2. JavaME(Micro Edition):支持 Java 程序運(yùn)行在移動(dòng)終端(手機(jī)、PDA)上的平臺(tái)一汽。
    3. JavaSE(Standard Edition):支持面向桌面級(jí)應(yīng)用(如 Windows 下的應(yīng)用程序)的 Java 平臺(tái)避消,提供了完整版的 Java 核心 API,這個(gè)版本以前也稱為 J2SE召夹。
    4. JavaEE(Enterprise Edition):支持使用多層架構(gòu)的企業(yè)應(yīng)用(如 ERP沾谓、CRM 應(yīng)用)的 Java 平臺(tái),除了提供 JavaSE API 外戳鹅,還對(duì)其做了大量的擴(kuò)充并提供了相關(guān)的部署支持均驶,這個(gè)版本以前稱為 J2EE。

1.3 - Java 發(fā)展史

  • 從1996年 第一個(gè) Java 版本誕生到現(xiàn)在已經(jīng)有了20幾年時(shí)間枫虏,其中誕生了無(wú)數(shù)和 Java 相關(guān)的產(chǎn)品妇穴、技術(shù)和標(biāo)準(zhǔn),讓我們一同回顧下 Java 的發(fā)展軌跡和歷史變遷隶债。
Java-version-history
  • 1994-04:由 James Gosling 博士領(lǐng)導(dǎo)的綠色計(jì)劃(Green Project) 開(kāi)始啟動(dòng)腾它,此計(jì)劃的目的是開(kāi)發(fā)一種能夠在各種消費(fèi)性電子產(chǎn)品(如機(jī)頂盒、冰箱死讹、收音機(jī)等)上運(yùn)行的程序架構(gòu)瞒滴。這個(gè)計(jì)劃的產(chǎn)品就是 Java 語(yǔ)言的前身:Oak(橡樹(shù))。Oak 當(dāng)時(shí)在消費(fèi)品市場(chǎng)上并不算成功赞警,但隨著 1995 年互聯(lián)網(wǎng)潮流的興起妓忍,Oak 迅速找到了最適合自己發(fā)展的市場(chǎng)定位并蛻變成為 Java 語(yǔ)言。

  • 1994-05-23:Oak 語(yǔ)言改名為 Java愧旦,并且在 SunWorld 大會(huì)上正式發(fā)布 Java1.0 版本世剖。Java 語(yǔ)言第一次提出了 Write Once, Run Anywhere 的口號(hào)。

  • 1996-01-23:JDK 1.0 發(fā)布笤虫,Java 語(yǔ)言有了第一個(gè)正式版本的運(yùn)行環(huán)境旁瘫。JDK 1.0 提供了一個(gè)純解釋執(zhí)行的 Java 虛擬機(jī)實(shí)現(xiàn)(Sun Classic VM)。JDK 1.0 版本的代表技術(shù)包括:(Java 虛擬機(jī)琼蚯、Applet酬凳、AWT 等)。

  • 1996-04:10個(gè)最主要的操作系統(tǒng)供應(yīng)商申明將在其產(chǎn)品中嵌入 Java 技術(shù)遭庶。同年 9月宁仔,已有大約 8.3 萬(wàn)個(gè)網(wǎng)頁(yè)應(yīng)用了 Java 技術(shù)來(lái)制作焚刺。在 1996年5月底,Sun 公司于美國(guó)舊金山舉行了 首屆 JavaOne 大會(huì)躁倒,從此 JavaOne 成為全世界數(shù)百萬(wàn) Java 語(yǔ)言開(kāi)發(fā)者每年一度的技術(shù)盛會(huì)颓屑。

  • 1997-02-19:Sun 公司發(fā)布了 JDK 1.1粘捎,Java 技術(shù)的一些最基礎(chǔ)的支撐點(diǎn)(JDBC 等)都是在 JDK 1.1 版本中發(fā)布的几苍,JDK 1.1版本的代表技術(shù)有(1.JAR 文件格式秆乳、2.JDBC握牧、3.JavaBeans阻逮、4.RMI)粱快。Java 語(yǔ)法也有了一定的發(fā)展,如內(nèi)部類(Inner Class)和反射(Reflection) 都是在這個(gè)時(shí)候出現(xiàn)的叔扼。

  • 1998-12-04:JDK 迎來(lái)了一個(gè)里程碑式的版本 JDK 1.2事哭,工程代號(hào)為 Playground(競(jìng)技場(chǎng)),Sun 在這個(gè)版本中把 Java 技術(shù)體系拆分為 3 個(gè)方向瓜富,分別是:

    • 面向桌面應(yīng)用開(kāi)發(fā)的 J2SE(Java 2 Platform鳍咱,Standard Edition)
    • 面向企業(yè)級(jí)開(kāi)發(fā)的 J2EE(Java 2 Platform,Enterprise Edition)
    • 面向手機(jī)等移動(dòng)端開(kāi)發(fā)的 J2ME(Java 2 Platform与柑,Micro Edition)谤辜。
      在這個(gè)版本中出現(xiàn)的代表性技術(shù)非常多(EJBJava Plug-in价捧、Java IDL丑念、Swing 等),并且這個(gè)版本中 Java 虛擬機(jī)第一次內(nèi)置了 JIT(Just In Time) 編譯器(JKD 1.2中曾并存過(guò)3個(gè)虛擬機(jī)结蟋,Classic VM脯倚、HotSpot VMExact VM,其中 Exact VM 只能以外掛的形式使用 JIT 編譯器)嵌屎。在語(yǔ)言和 API 級(jí)別上推正,Java 添加了 strictfp 關(guān)鍵字與現(xiàn)在 Java 編碼中極為常用的一系列 Collection 集合類。
  • 1999-04-27:HotSpot 虛擬機(jī)發(fā)布宝惰,HotSpot 最初由一家名為 Longview Technologies 的小公司開(kāi)發(fā)舔稀,因?yàn)槠鋬?yōu)異的表現(xiàn),這家公司在 1997 年被 Sun 公司收購(gòu)了掌测。HotSpot 虛擬機(jī)發(fā)布時(shí)是作為 JDK 1.2的附加程序提供的内贮,后來(lái)它成為了 JDK 1.3 及之后所有版本的 Sun JDK 的默認(rèn)虛擬機(jī)。

  • 2002-02-13:JDK 1.4發(fā)布汞斧,工程代號(hào)為 Merlin(灰背隼)夜郁。JDK 1.4 是 Java 真正走向成熟的一個(gè)版本,Compaq粘勒、Fujitsu竞端、SAS、Symbian庙睡、IBM 等著名公司都有參與甚至實(shí)現(xiàn)自己獨(dú)立的 JDK 1.4事富。仍然有許多主流應(yīng)用(Spring技俐、Hibernate、Struts 等)能直接運(yùn)行在 JDK 1.4 之上统台,或者繼續(xù)發(fā)布能運(yùn)行在 JDK 1.4 上的版本雕擂。JDK 1.4 同樣發(fā)布了很多新的技術(shù)特性(正則表達(dá)式異常鏈贱勃、NIO井赌、日志類XML解析器XSLT轉(zhuǎn)換器 等)贵扰。

  • 2004-09-30:JDK 1.5 發(fā)布(從這個(gè)版本開(kāi)始官方正式文檔宣傳上已經(jīng)不再使用類似 JDK1.5的命名仇穗,只有在程序員內(nèi)部使用的開(kāi)發(fā)版本號(hào),例如 java -version 的輸出戚绕,而公開(kāi)版本號(hào)則改為 JDK 5)纹坐,工程代號(hào) Tiger(老虎)。從 JDK 1.2 以來(lái)舞丛,Java 在語(yǔ)法層面上的變換一直很小恰画,而 JDK 1.5 在 Java 語(yǔ)法易用性上做出了非常大的改進(jìn)。例如(自動(dòng)裝箱瓷马、泛型拴还、動(dòng)態(tài)注釋枚舉欧聘、可變長(zhǎng)參數(shù)片林、foreach循環(huán) 等)語(yǔ)法特性都是在 JDK 1.5 中加入的。在虛擬機(jī)和 API 層面上怀骤,這個(gè)版本改進(jìn)了 Java 的內(nèi)存模型(Java Memory Model, JVM)费封、提供了 java.util.concurrent 并發(fā)包等。

  • 2006-12-11:JDK 1.6 發(fā)布蒋伦,工程代號(hào) Mustang(野馬)弓摘。在這個(gè)版本中 Sun 終結(jié)了 JDK 1.2 開(kāi)始已經(jīng)有8年歷史的 J2EE、J2SE痕届、J2ME 的命名方式韧献,啟用 Java SE 6、Java EE 6研叫、Java ME 6的命名方式锤窑。JDK 1.6 的改進(jìn)包括:提供動(dòng)態(tài)語(yǔ)言支持(通過(guò)內(nèi)置 Mozilla JavaScript Rhino 引擎實(shí)現(xiàn))、提供編譯 API 和微型 HTTP 服務(wù)器 API 等嚷炉。同時(shí)渊啰,這個(gè)版本對(duì) Java 虛擬機(jī)內(nèi)部做了大量改進(jìn),包括 鎖與同步垃圾回收绘证、類加載 等方面的算法都有相當(dāng)多的改動(dòng)隧膏。

  • 2006-11-13:JavaOne 大會(huì)上,Sun 公司宣布最終會(huì)將 Java 開(kāi)源嚷那,并在隨后的一年多時(shí)間內(nèi)胞枕,陸續(xù)將 JDK 的各個(gè)部分在 GPL v2(GNU General Public License v2)協(xié)議下 公開(kāi)了源碼,并建立了 OpenJDK 組織對(duì)這些源碼進(jìn)行獨(dú)立管理车酣。除了極少量的產(chǎn)權(quán)代碼(Encumbered Code,這部分代碼大多是 Sun 本身也無(wú)權(quán)限進(jìn)行開(kāi)源處理的)外索绪,OpenJDK 幾乎包括了 Sun JDK 的全部代碼湖员,OpenJDK 的質(zhì)量主管曾經(jīng)表示,在 JDK 1.7 中瑞驱,Sun JDK 和 OpenJDK 除了代碼文件頭的版權(quán)注釋之外娘摔,代碼基本上完全一樣,所以 OpenJDK 7 與 Sun JDK 1.7 本質(zhì)上就是同一套代碼庫(kù)開(kāi)發(fā)的產(chǎn)品唤反。

  • JDK 1.6 發(fā)布以后凳寺,由于代碼復(fù)雜性的增加、JDK 開(kāi)源彤侍、開(kāi)發(fā) JavaFX肠缨、經(jīng)濟(jì)危機(jī)及 Sun 收購(gòu)案等原因,Sun 在 JDK 發(fā)展以外的事情上耗費(fèi)了很多資源盏阶,JDK 的更新并沒(méi)有再維持兩年發(fā)布一個(gè)版本的發(fā)展速度??晒奕。

  • 2009-02-19:工程代號(hào)為 Dolphin(海豚)的 JDK 1.7 完成了其第一個(gè)里程碑版本。根據(jù) JDK 1.7 的功能規(guī)劃名斟,一共設(shè)置了10個(gè)里程碑脑慧。最后一個(gè)里程碑版本原計(jì)劃與 2010 年 9 月 9 日技術(shù),但由于各種原因砰盐,JDK 1.7 最終無(wú)法按計(jì)劃完成闷袒。

  • 從 JDK 1.7 最開(kāi)始的功能規(guī)劃來(lái)看,它本應(yīng)是一個(gè)包含許多重要改進(jìn)的 JDK 版本岩梳,其中 Lambda 項(xiàng)目(Lambda表達(dá)式囊骤、函數(shù)式編程)、Jigsaw項(xiàng)目(虛擬機(jī)模塊化支持)冀值、動(dòng)態(tài)語(yǔ)言支持淘捡、GarbageFirst收集器Coin項(xiàng)目(語(yǔ)言細(xì)節(jié)進(jìn)化)等子項(xiàng)目對(duì)于 Java 業(yè)界都會(huì)產(chǎn)生深遠(yuǎn)的影響。在 JDK 1.7 開(kāi)發(fā)期間池摧,Sun 公司由于相繼在技術(shù)競(jìng)爭(zhēng)和商業(yè)競(jìng)爭(zhēng)中都陷入泥潭焦除,公司的股票市值跌至僅有高峰時(shí)期的 3%??(心疼),已無(wú)力推動(dòng) JDK 1.7 的研發(fā)工作按正常計(jì)劃進(jìn)行作彤。為了盡快結(jié)束 JDK 1.7 長(zhǎng)期 ”跳票” 的問(wèn)題膘魄,Oracle 公司收購(gòu) Sun 公司后不久便宣布將實(shí)行 “B計(jì)劃”乌逐,大幅裁剪了 JDK 1.7 預(yù)訂目標(biāo),以便保證 JDK 1.7 的正式版能夠與 2011年7月28日準(zhǔn)時(shí)發(fā)布创葡≌闾撸”B計(jì)劃” 把不能按時(shí)完成的 Lambda 項(xiàng)目、Jigsaw 項(xiàng)目和 Coin 項(xiàng)目的部分改進(jìn)延遲到 JDK 1.8之中灿渴。最終洛波,JDK 1.7 的主要改進(jìn)包括:提供新的 G1收集器加強(qiáng)對(duì)非 Java 語(yǔ)言的調(diào)用支持骚露、升級(jí)類加載架構(gòu) 等蹬挤。

  • 2009-04-20:Oracle 公司宣布正式以74億美元的價(jià)格收購(gòu) Sun 公司,Java 商標(biāo)從此正式歸 Oracle 所有( Java 語(yǔ)言本身并不屬于哪家公司所有棘幸,它由 JCP 組織進(jìn)行管理焰扳,盡管 JCP 主要是由 Sun 公司或者說(shuō) Oracle 公司所領(lǐng)導(dǎo)的 )。由于此前 Oracle 公司已經(jīng)收購(gòu)了另外一家大型的中間件企業(yè) BEA 公司误续,在完成對(duì) Sun 公司的收購(gòu)之后吨悍,Oracle 公司分別從 BEASun 中取得了目前三大商業(yè)虛擬機(jī)其中兩個(gè):JRockitHotSpot,Oracle 公司宣布在未來(lái)的 1-2年的時(shí)間內(nèi)蹋嵌,將把這兩個(gè)優(yōu)秀的虛擬機(jī)相互取長(zhǎng)補(bǔ)短育瓜,最終合二為一。

  • 在 2011年的 JavaOne 大會(huì)上栽烂,Oracle 公司還提到了 JDK 1.9 的長(zhǎng)遠(yuǎn)規(guī)劃爆雹,希望未來(lái)的 Java 虛擬機(jī)能夠管理數(shù)以 GB 計(jì)的 Java 堆??,能夠更高效地與本地代碼繼承愕鼓,并且令 Java 虛擬機(jī)運(yùn)行時(shí)盡可能少人工干預(yù)钙态,能夠自動(dòng)調(diào)節(jié)。


1.4 - Java 虛擬機(jī)發(fā)展史

上一節(jié)從整個(gè) Java 技術(shù)的角度觀察了 Java 技術(shù)的發(fā)展菇晃,許多 Java 程序員都會(huì)潛意識(shí)地把它與 Sun 公司的 HotSpot 虛擬機(jī)等同看待册倒,也許還有一些人會(huì)注意到 BEA JRockitIBM J9,但對(duì) JVM 的認(rèn)識(shí)不僅僅只有這些磺送。

  • 從 1996 年初 Sun 公司發(fā)布的 JDK 1.0 中所包含的 Sun Classic VM 到今天驻子,曾經(jīng)涌現(xiàn)、湮滅過(guò)許多經(jīng)典或優(yōu)秀或有特色的虛擬機(jī)實(shí)現(xiàn)估灿,在這一節(jié)中我們一起來(lái)回顧一下 Java 虛擬機(jī)家族的發(fā)展軌跡和歷史變遷崇呵。

1.4.1 - Sun Classic / Exact VM

  • 從今天的視角來(lái)看,Sun Classic VM 的技術(shù)可能很原始馅袁,這款虛擬機(jī)的使命也早已終結(jié)域慷。但僅憑它 世界上第一款商用 Java 虛擬機(jī) 的頭銜,就足夠有讓歷史記住它的理由??。

  • 1996-01-23:Sun 公司發(fā)布 JDK 1.0犹褒,Java 語(yǔ)言首次擁有了商用的正式運(yùn)行環(huán)境抵窒,這個(gè) JDK 中所帶的虛擬機(jī)就是 Classic VM。這款虛擬機(jī)只能使用純解釋器方式來(lái)執(zhí)行 Java 代碼叠骑,如果要使用 JIT 編譯器李皇,就必須進(jìn)行外掛。但是加入外掛了 JIT 編譯器宙枷,JIT 編譯器就完全接管了虛擬機(jī)的執(zhí)行系統(tǒng)掉房,解釋器便不再工作了。用戶在這款虛擬機(jī)上執(zhí)行 java -version 命令慰丛,將會(huì)看到類似下面這行輸出

java version "1.2.2" 
Classic VM (build JDK-1.2.2-001, green threads, sunwjit)
  • 其中的 sunwjit 就是 Sun 提供的外掛編譯器卓囚,其他類似的外掛編譯器還有 Symantec JITshuJIT 等。由于 解釋器編譯器 不能配合工作璧帝,這就意味著如果要使用編譯器執(zhí)行捍岳,編譯器就不得不對(duì)每一個(gè)方法富寿、每一行代碼都進(jìn)行編譯睬隶,而無(wú)論他們執(zhí)行的頻率是否具有編譯的價(jià)值∫承欤基于程序響應(yīng)時(shí)間的壓力苏潜,這些編譯器根本不敢應(yīng)用編譯耗時(shí)稍高的優(yōu)化技術(shù),因此這個(gè)階段的虛擬機(jī)即使使用了 JIT 編譯器輸出本地代碼变勇,執(zhí)行效率也和傳統(tǒng)的 C/C++ 程序有很大差距恤左,Java 語(yǔ)言很慢 的形象就是在這時(shí)候開(kāi)始在用戶心中樹(shù)立起來(lái)的。

  • Sun 的虛擬機(jī)團(tuán)隊(duì)努力去解決 Classic VM 所面臨的各種問(wèn)題搀绣,提升運(yùn)行效率飞袋。在 JDK 1.2 時(shí),曾在 Solaris 平臺(tái)上發(fā)布過(guò)一款名為 Exact VM 的虛擬機(jī)链患,它的執(zhí)行系統(tǒng)已經(jīng)具備現(xiàn)代高性能虛擬機(jī)的雛形:如 兩級(jí)即時(shí)編譯器巧鸭、編譯器與解釋器混合工作模式 等。Exact VM 因它使用 準(zhǔn)確式內(nèi)存管理(Exact Memory Management)而得名麻捻,即虛擬機(jī)可以知道內(nèi)存中某個(gè)位置的數(shù)據(jù)具體是什么類型纲仍。例如內(nèi)存中有一個(gè) 32 位的整數(shù) 123456,它到底是 reference 類型指向 123456 的內(nèi)存地址還是一個(gè)數(shù)值為 123456 的整數(shù)贸毕,虛擬機(jī)將有能力分辨出來(lái)郑叠,這樣才能在 GC(垃圾收集)的時(shí)候準(zhǔn)確判斷堆上的數(shù)據(jù)是否還可以被使用。由于使用了準(zhǔn)確式內(nèi)存管理明棍,Exact VM 可以拋棄以前 Classic VM 基于 handler 的對(duì)象查找方式(原因是進(jìn)行 GC 后對(duì)象將可能會(huì)被移動(dòng)位置乡革,如果將地址為 123456 的對(duì)象移動(dòng)到 654321,在沒(méi)有明確信息表明內(nèi)存中哪些數(shù)據(jù)是 reference 的前提下,虛擬機(jī)是不敢把內(nèi)存中所有 123456 的值改為 654321 的署拟,所以要使用句柄來(lái)保持 refrence 值的穩(wěn)定)婉宰,這樣每次定位對(duì)象都少了一次間接查找的開(kāi)銷,提升執(zhí)行性能推穷。

  • 雖然 Exact VM 的技術(shù)相對(duì) Classic VM 來(lái)說(shuō)先進(jìn)了許多心包,但是在商業(yè)應(yīng)用上只存在了很短暫的時(shí)間就被更為優(yōu)秀的 HotSpot VM 所取代,甚至還沒(méi)有來(lái)得及發(fā)布 Windows 和 Linux 平臺(tái)下的商用版本馒铃。而 Classic VM 的生命周期則相對(duì)長(zhǎng)了許多蟹腾,它在 JDK 1.2 之前是 Sun JDK 中唯一的虛擬機(jī),在 JDK 1.2時(shí)区宇,它與 HotSpot VM 并存娃殖,但默認(rèn)使用的是 Classic VM,而在 JDK 1.3 時(shí)议谷,HotSopt VM 成為默認(rèn)虛擬機(jī)炉爆,但 Classic VM 仍作為虛擬機(jī)的 “備用選擇” 發(fā)布,直到 JDK 1.4 的時(shí)候卧晓,Classic VM 才完全退出商用虛擬機(jī)的歷史舞臺(tái)芬首,與 Exact VM 一起進(jìn)入了 Sun Labs Research VM 中 ??。

1.4.2 - Sun HotSpot VM

  • 提起 HotSpot VM逼裆,相信所有 Java 程序員都知道郁稍,它是 Sun JDK 和 OpenJDK 中所帶的虛擬機(jī),也是目前 使用范圍最廣的 Java 虛擬機(jī)胜宇。但不一定所有人都知道的是耀怜,這個(gè)目前看來(lái) ”血統(tǒng)純正” 的虛擬機(jī)在最初并非由 Sun 公司開(kāi)發(fā),而是一家名為 Longview Technologies 的小公司設(shè)計(jì)的桐愉;設(shè)置這個(gè)虛擬機(jī)最初并非是為 Java 語(yǔ)言而開(kāi)發(fā)的财破,它來(lái)源于 Strongtalk VM,而這款虛擬機(jī)中相當(dāng)多的技術(shù)又是來(lái)源于一款 Self 語(yǔ)言實(shí)現(xiàn) “可能達(dá)到 C 語(yǔ)言 50% 以上的執(zhí)行效率” 的目標(biāo)而設(shè)計(jì)的虛擬機(jī)从诲,Sun 公司注意到了這款虛擬機(jī)在 JIT 編譯上有許多優(yōu)秀的理念和實(shí)際效果左痢,在 1997 年收購(gòu)了 Longview Technologies 公司,從而獲得了 HotSpot VM盏求。

  • HotSpot VM 繼承了 Sun 之前兩款商用虛擬機(jī)的優(yōu)點(diǎn) => 準(zhǔn)確式內(nèi)存管理抖锥,也有許多自己新的技術(shù)優(yōu)勢(shì),如它名稱中的 HotSpot 指的就是它的 熱點(diǎn)代碼探測(cè)技術(shù)(其實(shí)兩個(gè) VM 基本上是同時(shí)期的獨(dú)立產(chǎn)品碎罚,HotSpot 還稍早一些磅废,HotSpot 一開(kāi)始就是準(zhǔn)確式 GC,而 Exact VM 中也有與之幾乎一樣的熱點(diǎn)探測(cè)荆烈。為了 Exact VM 和 HotSpot VM 哪個(gè)成為 Sun 主要支持的 VM 產(chǎn)品拯勉,在 Sun 公司內(nèi)部還有過(guò)爭(zhēng)論竟趾,HotSpot 打敗 Exact 并不能算技術(shù)上的勝利),HotSpot VM 的熱點(diǎn)代碼探測(cè)能力可以通過(guò)執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼宫峦,然后通知 JIT 編譯器以方法為單位進(jìn)行編譯岔帽。如果一個(gè)方法被頻繁調(diào)用,或方法中有效循環(huán)次數(shù)很多导绷,將會(huì)被分別觸發(fā) 標(biāo)準(zhǔn)編譯OSR(棧上替換) 編譯動(dòng)作犀勒。通過(guò)編譯器與解釋器恰當(dāng)?shù)貐f(xié)同工作,可以在最優(yōu)化的程序相應(yīng)時(shí)間與最佳執(zhí)行性能中取得平衡妥曲,而且無(wú)須等待本地代碼輸出才能執(zhí)行程序贾费,即時(shí)編譯的時(shí)間壓力也相對(duì)減小,這樣有助于引入更多的代碼優(yōu)化技術(shù)檐盟,輸出質(zhì)量更高的本地代碼褂萧。

  • 在 2006 年的 JavaOne 大會(huì)上,Sun 公司宣布最終會(huì)把 Java 開(kāi)源葵萎,并在隨后的一年导犹,陸續(xù)將 JDK 的各個(gè)部分(其中當(dāng)然也包括了 HotSpot VM)在 GPL 協(xié)議下公開(kāi)了源碼,并在此基礎(chǔ)上建立了 OpenJDK羡忘。這樣谎痢,HotSpot VM 便成為了 Sun JDK 和 OpenJDK 兩個(gè)實(shí)現(xiàn)極度接近的 JDK 項(xiàng)目的共同虛擬機(jī)。

1.4.3 - Sun Mobile-Embedded VM / Meta-Circular VM

  • Sun 公司所研發(fā)的虛擬機(jī)可不僅有前面介紹的服務(wù)器壳坪、桌面領(lǐng)域的商用虛擬機(jī)舶得,除此之外掰烟,Sun 公司面對(duì) 移動(dòng)嵌入式市場(chǎng)爽蝴,也發(fā)布過(guò)虛擬機(jī)產(chǎn)品,另外還有一類虛擬機(jī)纫骑,在設(shè)計(jì)之初就沒(méi)報(bào)有商用目的蝎亚,僅僅是用于研究、驗(yàn)證某種技術(shù)和觀點(diǎn)先馆,又或者是作為一些規(guī)范的標(biāo)準(zhǔn)實(shí)現(xiàn)发框。這些虛擬機(jī)對(duì)于大部分不從事相關(guān)領(lǐng)域開(kāi)發(fā)的 Java 程序員來(lái)說(shuō)可能比較陌生,Sun 公司發(fā)布的其他 Java 虛擬機(jī)有
    1. KVM:K 是 Kilobyte 的意思煤墙,它強(qiáng)調(diào)簡(jiǎn)單梅惯、輕量、高度可移植仿野,但是運(yùn)行速度比較慢铣减。在 Android、iOS 等智能手機(jī)操作系統(tǒng)出現(xiàn)前曾經(jīng)在手機(jī)平臺(tái)上得到非常廣泛的應(yīng)用脚作。
    2. CDC/CLDC HotSpot Implementation:CDC/CLDC全稱是 Connected(Limited)Device Configuration葫哗,在 JSR-136缔刹、JSR-218 規(guī)范中進(jìn)行定義,它希望在手機(jī)劣针、電子書(shū)校镐、PDA 等設(shè)備上建立統(tǒng)一的 Java 編程接口,而 CDC-HI VMCLDC-HI VM 則是它們的一組參考實(shí)現(xiàn)捺典。CDC/CLDC 是整個(gè) JavaME 的重要支柱鸟廓,但從目前 Android 和 iOS 二分天下的移動(dòng)數(shù)字設(shè)備市場(chǎng)看來(lái),在這個(gè)領(lǐng)域中襟己,Sun 的虛擬機(jī)所面臨的局面遠(yuǎn)不如服務(wù)器和桌面領(lǐng)域樂(lè)觀肝箱。
    3. Squawk VM:Squawk VM 由 Sun 公司開(kāi)發(fā),運(yùn)行于 Sun SPOT(Sun Small Programmable Object Technology稀蟋,一種手持的 WiFi 設(shè)備)煌张,也曾經(jīng)運(yùn)用于 Java Card。這是一個(gè) Java 代碼比重很高的嵌入式虛擬機(jī)實(shí)現(xiàn)退客,其中諸如類加載器骏融、字節(jié)碼驗(yàn)證器、垃圾回收器萌狂、解釋器档玻、編譯器和線程調(diào)度都是 Java 語(yǔ)言本身完成的,僅僅靠 C 語(yǔ)言來(lái)編寫設(shè)備 I/O 和必要的本地代碼茫藏。
    4. JavaInJava:JavaInJava 是 Sun 公司于 1997-1998 年間研發(fā)的一個(gè)實(shí)驗(yàn)室性質(zhì)的虛擬機(jī)误趴,從名字就可以看出,它試圖以 Java 語(yǔ)言來(lái)實(shí)現(xiàn) Java 語(yǔ)言本身的運(yùn)行環(huán)境务傲,即所謂的 “元循環(huán)”(Meta-Circular凉当,是指使用語(yǔ)言自身來(lái)實(shí)現(xiàn)其運(yùn)行環(huán)境)。它必須運(yùn)行在另外一個(gè)宿主虛擬機(jī)之上售葡,內(nèi)部沒(méi)有 JIT 編譯器看杭,代碼只能以解釋模式執(zhí)行。在 20世紀(jì)末主流 Java 虛擬機(jī)都未能很好解決性能問(wèn)題的時(shí)代挟伙,開(kāi)發(fā)這種項(xiàng)目楼雹,其執(zhí)行速度可想而知。
    5. Maxine VM:Maxine VM 和上面的 JavaInJava 非常相似尖阔,它也是一個(gè)幾乎全部以 Java 代碼實(shí)現(xiàn)(只有用于啟動(dòng) JVM 的加載器使用 C 語(yǔ)言編寫)的元循環(huán) Java 虛擬機(jī)贮缅。這個(gè)項(xiàng)目于 2005 年開(kāi)始,到現(xiàn)在仍然在發(fā)展之中介却,比起 JavaInJava谴供,Maxine VM 就顯得 “靠譜” 很多,它有先進(jìn)的 JIT 編譯器和垃圾回收器(但沒(méi)有解釋器)筷笨,可以在宿主模式或獨(dú)立模式下執(zhí)行憔鬼,其執(zhí)行效率已經(jīng)接近了 HotSpot Client VM 的水平龟劲。

1.4.4 BEA JRockit / IBM J9 VM

前面介紹了 Sun 公司的各種虛擬機(jī),除了 Sun 公司以外轴或,其他組織昌跌、公司也研發(fā)過(guò)不少虛擬機(jī)實(shí)現(xiàn),其中規(guī)模最大照雁、最著名的就是 BEAIBM 公司了蚕愤。

  • JRockit VM 曾經(jīng)號(hào)稱 世界上速度最快的 Java 虛擬機(jī)(廣告詞,貌似 J9 VM 也這樣說(shuō)過(guò)??)饺蚊,它是 BEA 公司在 2002 年從 Appeal Virtual Machines 公司收購(gòu)的虛擬機(jī)萍诱。BEA 公司將其發(fā)展為一款 專門為服務(wù)器硬件和服務(wù)器端應(yīng)用場(chǎng)景高度優(yōu)化的虛擬機(jī),由于專注于服務(wù)器端應(yīng)用污呼,它可以不太關(guān)注程序啟動(dòng)速度裕坊,因此 JRockit 內(nèi)部不包含解析器實(shí)現(xiàn),全部代碼都靠即時(shí)編譯器編譯后執(zhí)行燕酷。除此之外籍凝,JRockit 的垃圾收集器和 MissionControl 服務(wù)套件等部分的實(shí)現(xiàn),在眾多 Java 虛擬機(jī)中也一直處于領(lǐng)先水平苗缩。

  • IBM J9 VM 并不是 IBM 公司唯一個(gè) Java 虛擬機(jī)饵蒂,不過(guò)是目前其主力發(fā)展的 Java 虛擬機(jī)。IBM J9 VM 原本是內(nèi)部開(kāi)發(fā)代號(hào)酱讶,正式名稱是 “IBM Technology for Java Virtual Machine”退盯,簡(jiǎn)稱 IT4J,只是這個(gè)名字太拗口了一點(diǎn)泻肯,普及程度不如 J9渊迁。J9 VM 最初是由 IBM Ottawa 實(shí)驗(yàn)室一個(gè)名為 SmallTalk 的虛擬機(jī)擴(kuò)展而來(lái),當(dāng)時(shí)這個(gè)虛擬機(jī)有一個(gè) bug 是由 8k 值定義錯(cuò)誤引起的软免,工程師花了很長(zhǎng)時(shí)間終于發(fā)現(xiàn)并解決了這個(gè)錯(cuò)誤宫纬,此后這個(gè)版本的虛擬機(jī)就稱為 K8 了焚挠,后來(lái)擴(kuò)展出支持 Java 的虛擬機(jī)就被稱為 J9 了膏萧。與 BEA JRockit 專注于服務(wù)器端應(yīng)用不同,IBM J9 的市場(chǎng)定位與 Sun HotSpot 比較接近蝌衔,它是一款設(shè)計(jì)上 從服務(wù)器端到桌面應(yīng)用再到嵌入式都全面考慮的多用途虛擬機(jī)榛泛,J9 的開(kāi)發(fā)目的是做為 IBM 公司各種 Java 產(chǎn)品的執(zhí)行平臺(tái),它的主要市場(chǎng)是和 IBM 產(chǎn)品(如 IBM WebSphere 等)搭配以及在 IBM AIX 和 z/OS 這些平臺(tái)上部署 Java 應(yīng)用噩斟。

1.4.5 - Azul VM / BEA Liquid VM

我們平時(shí)所提及的 “高性能 Java 虛擬機(jī)”曹锨,一般是指 HotSpot、JRockit剃允、J9這類在通用平臺(tái)上運(yùn)行的商用虛擬機(jī)沛简,但其實(shí) Azul VMBEA Liquid VM 這類特定硬件平臺(tái)專有的虛擬機(jī)才是 高性能 的武器齐鲤。

  • Azul VM 是 Azul Systems 公司在 HotSpot 基礎(chǔ)上進(jìn)行大量改進(jìn)嘲碧,運(yùn)行于 Azul Systems 公司的專有硬件 Vega 系統(tǒng)上的 Java 虛擬機(jī)大磺,每個(gè) Azul VM 實(shí)例都可以管理至少數(shù)十個(gè) CPU 和數(shù)百 GB 內(nèi)存的硬件資源??,并提供
    在巨大內(nèi)存范圍內(nèi)實(shí)現(xiàn)可控的 GC 時(shí)間的垃圾收集器彪笼、為專有硬件優(yōu)化的線程調(diào)度 等優(yōu)秀特征捧灰。在 2010 年淆九,Azul System 公司開(kāi)始從硬件轉(zhuǎn)向軟件,發(fā)布了自己的 Zing JVM毛俏,可以在通用的 x86 平臺(tái)上提供接近于 Vega 系統(tǒng)的特性炭庙。

  • Liquid VM 即是現(xiàn)在的 JRockit VM 虛擬化版本,Liquid VM 不需要操作系統(tǒng)的支持煌寇,或者說(shuō)它自己 本身實(shí)現(xiàn)了一個(gè)專有操作系統(tǒng)的必要功能焕蹄,如文件系統(tǒng)、網(wǎng)絡(luò)操作等阀溶。由虛擬機(jī)越過(guò)通用操作系統(tǒng)直接控制硬件 可以獲得很多好處擦盾,如在線程調(diào)度時(shí),不需要再進(jìn)行內(nèi)核態(tài) / 用戶態(tài)的切換等淌哟,這樣可以最大限度地發(fā)揮硬件的功能迹卢,提升 Java 程序的執(zhí)行性能。

1.4.6 - Apache Harmony / Google Android Dalvik VM

這節(jié)介紹的兩個(gè)虛擬機(jī)只能稱作 “虛擬機(jī)”徒仓,而不能稱做 “Java 虛擬機(jī)”腐碱,但是這兩款虛擬機(jī)(以及所代表的技術(shù)體系)對(duì)最近幾年的 Java 世界產(chǎn)生了非常大的影響和挑戰(zhàn),甚至有些悲觀的評(píng)論家認(rèn)為成熟的 Java 生態(tài)系統(tǒng)有崩潰的可能掉弛。

  • Apache Harmony 是一個(gè) Apache 軟件基金會(huì)下以 Apache License 協(xié)議開(kāi)源的實(shí)際兼容于 JDK 1.5 和 JDK 1.6 的 Java 程序運(yùn)行平臺(tái)症见,這個(gè)介紹相當(dāng)拗口。它包含自己的虛擬機(jī)和 Java 庫(kù)殃饿,用戶可以在上面運(yùn)行 Eclipse谋作、Tomcat、Maven 等常見(jiàn)的 Java 程序乎芳,但是它沒(méi)有通過(guò) TCK 認(rèn)證遵蚜,所以我們不得不用那么長(zhǎng)一串拗口的語(yǔ)言來(lái)介紹它,而不能用一句 “Apache 的 JDK” 來(lái)說(shuō)明奈惑。如果一個(gè)公司要宣布自己的運(yùn)行平臺(tái) “兼容于 Java 語(yǔ)言”吭净,那就必須要通過(guò) TCK(Technology Compatibility Kit)的兼容性測(cè)試。Apache 基金會(huì)曾經(jīng)要求 Sun 公司提供 TCK 的使用授權(quán)肴甸,但是一直遭到拒絕寂殉,直到 Oracle 公司收購(gòu)了 Sun 公司之后,雙方關(guān)系越鬧越僵原在,最終導(dǎo)致 Apache 憤然退出 JCP(Java Community Process) 組織友扰,這是目前為止 Java 社區(qū)最嚴(yán)重的一次 “分裂”彤叉。

  • 在 Sun 將 JDK 開(kāi)源形成 OpenJDK 之后,Apache Harmony 開(kāi)源的優(yōu)勢(shì)被極大地削弱村怪,甚至連 Harmony 項(xiàng)目的最大參與者 IBM 公司也宣布辭去 Harmony 項(xiàng)目管理主席的職位姆坚,并參與 OpenJDK 項(xiàng)目的開(kāi)發(fā)。雖然 Harmony 沒(méi)有經(jīng)歷過(guò)真正大規(guī)模的商業(yè)運(yùn)作实愚,但是它的許多代碼(基本上是 Java 庫(kù)部分的代碼)被吸納進(jìn) IBM 的 JDK7 實(shí)現(xiàn)及 Google Android SDK 之中兼呵,尤其是對(duì) Android 的發(fā)展起到了很大的推動(dòng)作用。

  • 說(shuō)到 Android腊敲,這個(gè)時(shí)下最熱門的移動(dòng)數(shù)碼設(shè)備平臺(tái)在最近幾年間的發(fā)展過(guò)程中所取得的成果已經(jīng)遠(yuǎn)遠(yuǎn)超越了 Java ME 在過(guò)去十多年所取得的成果击喂,Android 讓 Java 語(yǔ)言真正走進(jìn)了移動(dòng)數(shù)碼設(shè)備領(lǐng)域,只是走的并非 Sun 公司原本想象的那一條路碰辅。

  • Dalvik VM 是 Android 平臺(tái)的核心組成部分之一懂昂,它的名字來(lái)源于冰島一個(gè)名為 Dalvik 的小漁村。Dalvik VM 并不是一個(gè) Java 虛擬機(jī)没宾,它沒(méi)有遵循 Java 虛擬機(jī)規(guī)范凌彬,不能直接執(zhí)行 Java 的 Class 文件,使用的是 寄存器架構(gòu) 而不是 JVM 中常見(jiàn)的 棧架構(gòu)循衰。但是它與 Java 又有著千絲萬(wàn)縷的聯(lián)系铲敛,它執(zhí)行的 dex(Dalvik Executable)文件可以通過(guò) Class 文件轉(zhuǎn)化而來(lái),使用 Java 語(yǔ)法編寫應(yīng)用程序会钝,可以直接使用大部分的 Java API 等伐蒋。目前 Dalvik VM 隨著 Android 一起處于一個(gè)迅猛發(fā)展階段,在 Android 2.2 中已提供即時(shí)編譯器實(shí)現(xiàn)迁酸,在執(zhí)行性能上有了很大的提高先鱼。

1.4.7 - Microsoft JVM 及其他

在十幾年的 Java 虛擬機(jī)發(fā)展過(guò)程中,除去上面介紹而那些被大規(guī)模商業(yè)應(yīng)用過(guò)的 Java 虛擬機(jī)外奸鬓,還有許多虛擬機(jī)是不為人知的或者曾經(jīng) “絢麗” 過(guò)但最終湮滅的焙畔。我們以其中微軟公司的 JVM 為例來(lái)介紹一下。

  • 也許 Java 程序員聽(tīng)起來(lái)可能會(huì)覺(jué)得驚訝串远,微軟公司曾經(jīng)是 Java 技術(shù)的鐵桿支持者(也必須承認(rèn)宏多,與 Sun 公司爭(zhēng)奪 Java 控制權(quán),令 Java 從跨平臺(tái)技術(shù)變?yōu)榻壎ㄔ?Windows 上的技術(shù)是微軟公司的主要目的)抑淫。在 Java 語(yǔ)言誕生初期(1996年-1998年绷落,以 JDK1.2 發(fā)布為界),它的主要應(yīng)用之一是在瀏覽器中運(yùn)行 Java Applets 程序始苇,微軟公司為了在 IE3 中支持 Java Applets 應(yīng)用而開(kāi)發(fā)了自己的 Java 虛擬機(jī),雖然這款虛擬機(jī)只有 Windows 平臺(tái)的版本筐喳,卻是當(dāng)時(shí) Windows 下性能最好的 Java 虛擬機(jī)催式,它在 1997年和1998年連續(xù)兩年獲得了《PC Magazine》雜志的 “編輯選擇獎(jiǎng)”函喉。但好景不長(zhǎng),在 1997年10月荣月,Sun 公司正式以侵犯商標(biāo)管呵、不正當(dāng)競(jìng)爭(zhēng)等罪名控告微軟公司,在隨后對(duì)微軟公司的壟斷調(diào)查之中哺窄,這款虛擬機(jī)也曾經(jīng)作為證據(jù)之一被呈送法庭捐下。這場(chǎng)官司的結(jié)果是微軟公司賠償 2000 萬(wàn)美金給 Sun 公司(最終微軟公司因壟斷賠償給 Sun 公司的總金額高達(dá) 10 億美元),承諾終止其 Java 虛擬機(jī)的發(fā)展萌业,并逐步在產(chǎn)品中移除 Java 虛擬機(jī)相關(guān)功能坷襟。具有諷刺意味的是,在最后 Windows XP SP3 中 Java 虛擬機(jī)被完全抹去的時(shí)候生年,Sun 公司卻又到處登報(bào)希望微軟公司不要這樣做婴程。Windows XP 高級(jí)產(chǎn)品經(jīng)理 Jim Cullinan 稱:”我們花了 3 年時(shí)間和 Sun 打官司,當(dāng)時(shí)他們?cè)噲D阻止我們?cè)?Windows 中支持 Java抱婉,現(xiàn)在我們這樣做了档叔,可他們又在抱怨,這太具有諷刺意味了蒸绩⊙盟模”

  • 如果當(dāng)前 Sun 公司沒(méi)有起訴微軟公司,微軟公司繼續(xù)保持對(duì) Java 技術(shù)的熱情患亿,那 Java 的世界會(huì)變得怎么樣呢届搁?.NET 技術(shù)是否會(huì)發(fā)展起來(lái)?但歷史是沒(méi)有假設(shè)的窍育。還有一些 Java 虛擬機(jī)是沒(méi)有介紹到的卡睦。


1.5 - 展望 Java 技術(shù)的未來(lái)

在 2005 年,Java 技術(shù)誕生 10 周年的 SunOne 技術(shù)大會(huì)上漱抓,Java 語(yǔ)言之父 James Gosling 做了一場(chǎng)題為 “Java 技術(shù)下一個(gè)十年” 的演講表锻。筆者不具備 James Gosling 博士那樣高屋建瓴的視角,這里僅從 Java 平臺(tái)中幾個(gè)新生的但已經(jīng)開(kāi)始展現(xiàn)出蓬勃之勢(shì)的技術(shù)發(fā)展點(diǎn)來(lái)看一下后續(xù) JDK 版本的一些很有希望的技術(shù)重點(diǎn)乞娄。

1.5.1 - 模塊化

  • 模塊化是解決應(yīng)用系統(tǒng)與技術(shù)平臺(tái)越來(lái)越服復(fù)雜瞬逊、越來(lái)越龐大問(wèn)題的一個(gè)重要途徑。無(wú)論是開(kāi)發(fā)人員還是產(chǎn)品最終用戶仪或,都不希望為了系統(tǒng)中一小塊的功能而不得不下載确镊、安裝、部署及維護(hù)整套龐大的系統(tǒng)范删。站在整個(gè)軟件工業(yè)化的高度來(lái)看蕾域,模塊化是建立各種功能的標(biāo)準(zhǔn)件的前提。最近幾年 OSGi 技術(shù)的迅速發(fā)展、各個(gè)廠商在 JCP 中對(duì)模塊化規(guī)范的激烈斗爭(zhēng)旨巷,都能充分說(shuō)明模塊化技術(shù)的迫切和重要巨缘。

  • 在未來(lái)的 Java 平臺(tái)中,很可能會(huì)對(duì)模塊化提出語(yǔ)法層面的支持采呐。早在 2007 年若锁,Sun 公司就提出過(guò) JSR-277:Java 模塊系統(tǒng)(Java Module System),試圖建立 Java 平臺(tái)的模塊化標(biāo)準(zhǔn)斧吐,但受挫于以 IBM 公司為主導(dǎo)提交的 JSR-291:Java SE 動(dòng)態(tài)組件支持(Dynamic Component Support for Java SE又固,這實(shí)際就是 OSGi R4.1)。由于模塊化規(guī)范主導(dǎo)權(quán)的重要性煤率,Sun 公司不能接受一個(gè)無(wú)法由它控制的規(guī)范仰冠,Sun 公司再次提交了一個(gè)新的規(guī)范請(qǐng)求文檔 JSR-294:Java 編程語(yǔ)言中的改進(jìn)模塊性支持(Improved Modularity Support in the Java Programming Language),盡管這個(gè) JSR 仍然沒(méi)有通過(guò)涕侈,但是 Sun 公司已經(jīng)獨(dú)立于 JCP 專家組在 OpenJDK 里建立了一個(gè)名為 Jigsaw(拼圖)的子項(xiàng)目來(lái)推動(dòng)這個(gè)規(guī)范在 Java 平臺(tái)中轉(zhuǎn)變?yōu)榫唧w的實(shí)現(xiàn)沪停。Java 模塊化之爭(zhēng)目前還沒(méi)有結(jié)束,OSGi 已經(jīng)發(fā)布到 R5.0 版本裳涛,而 Jigsaw 從 Java 7 延遲至 Java 8木张,在 2012 年 7 月又不得不宣布推遲到 Java9 中發(fā)布,從這點(diǎn)看來(lái)端三,Sun 在這場(chǎng)戰(zhàn)爭(zhēng)中處于劣勢(shì)舷礼,但無(wú)論勝利者是哪一方,Java 模塊化已經(jīng)成為一項(xiàng)無(wú)法阻擋的變革潮流郊闯。

1.5.2 - 混合語(yǔ)言

  • 當(dāng)單一的 Java 開(kāi)發(fā)已經(jīng)無(wú)法滿足當(dāng)前軟件的復(fù)雜需求時(shí)妻献,越來(lái)越多基于 Java 虛擬機(jī)的語(yǔ)言開(kāi)發(fā)被應(yīng)用到軟件項(xiàng)目中,Java 平臺(tái)上的多語(yǔ)言混合編程正成為為主流团赁,每種語(yǔ)言都可以針對(duì)自己擅長(zhǎng)的方面更好地解決問(wèn)題育拨。試想一下,在一個(gè)項(xiàng)目之中欢摄,并行處理用 Clojure 語(yǔ)言編寫熬丧,展示層使用 JRuby / Rails,中間層則是 Java怀挠,每個(gè)應(yīng)用層都將使用不同的編程語(yǔ)言來(lái)完成析蝴,而且,接口對(duì)每一層的開(kāi)發(fā)者都是透明的绿淋,各種語(yǔ)言之間的交互不存在任何困難闷畸,就像使用自己語(yǔ)言的原生 API 一樣方便,因?yàn)樗鼈冏罱K都運(yùn)行在一個(gè)虛擬機(jī)之上吞滞。

  • 在最近的幾年里佑菩,Clojure、JRuby、Groovy 等新生語(yǔ)言的使用人數(shù)不斷增長(zhǎng)倘待,而運(yùn)行在 Java 虛擬機(jī)(JVM)之上的語(yǔ)言數(shù)量也在迅速膨脹疮跑。通過(guò)特定領(lǐng)域的語(yǔ)言去解決特定領(lǐng)域的問(wèn)題 是當(dāng)前軟件開(kāi)發(fā)應(yīng)對(duì)日趨復(fù)雜的項(xiàng)目需求的一個(gè)方向组贺。

    Languages In The Java

  • 除了催生出大量的新語(yǔ)言外凸舵,許多已經(jīng)有很長(zhǎng)歷史的程序語(yǔ)言也出現(xiàn)了基于 Java 虛擬機(jī)實(shí)現(xiàn)的版本,這樣使得混合編程對(duì)許多以前使用其他語(yǔ)言的 “老” 程序員也具備相當(dāng)大的吸引力失尖,軟件企業(yè)投入了大量資本的現(xiàn)有代碼資產(chǎn)也能很好地保護(hù)起來(lái)啊奄。

1.5.3 - 多核并行

  • 如今,CPU 硬件的發(fā)展方向已經(jīng)從高頻率轉(zhuǎn)變?yōu)?多核心掀潮,隨著多核時(shí)代的來(lái)臨菇夸,軟件開(kāi)發(fā)越來(lái)越關(guān)注并行編程的領(lǐng)域。早在 JDK1.5 就已經(jīng)引入 java.util.concurrent 包實(shí)現(xiàn)了一個(gè)粗粒度的并發(fā)框架仪吧。而 JDK1.7 中加入的 java.util.cuncurrent.forkjoin 包則是對(duì)這個(gè)框架的一次重要擴(kuò)充庄新。Fork / Join模式 是處理并行編程的一個(gè)經(jīng)典方法。雖然不能解決所有的問(wèn)題薯鼠,但是在此模式的適用范圍之內(nèi)择诈,能夠輕松地利用多個(gè) CPU 核心提供的計(jì)算資源來(lái)協(xié)作完成一個(gè)復(fù)雜的計(jì)算任務(wù)。通過(guò)利用 Fork / Join 模式出皇,我們能夠更加順場(chǎng)地過(guò)渡到多核心時(shí)代羞芍。
    Fork / Join 模式
  • 在 Java 8 中,將會(huì)提供 Lambda 支持郊艘,這將會(huì)極大改善目前 Java 語(yǔ)言不適合 函數(shù)式編程 的現(xiàn)狀(目前 Java 語(yǔ)言使用函數(shù)式編程并不是不可以荷科,只是會(huì)顯得很臃腫),函數(shù)式編程的一個(gè)重要優(yōu)點(diǎn)就是這樣的程序天然地適合 并行運(yùn)行纱注,這對(duì) Java 語(yǔ)言在多核時(shí)代繼續(xù)保持主流語(yǔ)言的地位有很大幫助畏浆。

  • 另外,在并行計(jì)算中必須提及的還有 OpenJDK 的子項(xiàng)目 Sumatra狞贱,目前顯卡的算術(shù)運(yùn)算能力刻获、并行能力已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了 CPU,在圖形領(lǐng)域以發(fā)掘顯卡的潛力是近幾年計(jì)算機(jī)發(fā)展的方向之一斥滤,例如 C 語(yǔ)言的 CUDA将鸵。Sumatra 項(xiàng)目就是為 Java 提供使用 GPU(Graphics Processing Units)和 APU(Accelerated Processing Units) 運(yùn)算能力的工具,以后它將會(huì)直接提供 Java 語(yǔ)言層面的 API佑颇,或者為 Lambda 和其他 JVM 語(yǔ)言提供底層的并行運(yùn)算支持顶掉。

  • 在 JDK 外圍,也出現(xiàn)了專為滿足并行計(jì)算需求的計(jì)算框架挑胸,如 Apache 的 Hadoop Map / Reduce痒筒,這是一個(gè)簡(jiǎn)單易懂的并行框架,能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型集群上,并且能以一種可靠的容錯(cuò)方式并行處理 TB 級(jí)別的數(shù)據(jù)集簿透。另外移袍,還出現(xiàn)了諸如 Scala、Clojure 及 Erlang 等天生就具備并行計(jì)算能力的語(yǔ)言老充。

1.5.4 - 進(jìn)一步豐富語(yǔ)法

  • Java 5 曾經(jīng)對(duì) Java 語(yǔ)法進(jìn)行了一次擴(kuò)充葡盗,這次擴(kuò)充加入了自動(dòng)裝箱泛型啡浊、動(dòng)態(tài)注解觅够、枚舉可邊長(zhǎng)參數(shù)巷嚣、遍歷循環(huán) 等語(yǔ)法喘先,使得 Java 語(yǔ)言的精確性和易用性有了很大的進(jìn)步。在 Java 7(由于進(jìn)度壓力廷粒,許多改進(jìn)已推遲至 Java 8)中窘拯,對(duì) Java 語(yǔ)言進(jìn)行了另一次大規(guī)模的擴(kuò)充。Sun(以被 Oracle 收購(gòu))專門為改進(jìn) Java 語(yǔ)法在 OpenJDK 中建立了 Coin 子項(xiàng)目來(lái)統(tǒng)一處理對(duì) Java 語(yǔ)法的細(xì)節(jié)修改坝茎,如二進(jìn)制數(shù)的原生支持涤姊、在 switch 語(yǔ)句中支持字符串、<>等操作符景东、異常處理的改進(jìn)砂轻、簡(jiǎn)化變長(zhǎng)參數(shù)方法調(diào)用、面向資源的 try-catch-finally 語(yǔ)句等都是在 Coin 項(xiàng)目之中提交的內(nèi)容斤吐。

  • 除了 Coin 項(xiàng)目之外搔涝,在 JSR-355(Lambda Expressions for the Java TM Programming Language)中定義的 Lambda 表達(dá)式也將對(duì) Java 的語(yǔ)法和語(yǔ)言習(xí)慣產(chǎn)生很大的影響,面向函數(shù)方式的編程可能會(huì)成為主流和措。

1.5.5 - 64位虛擬機(jī)

  • 在幾年之前庄呈,主流的 CPU 就開(kāi)始支持 64 位架構(gòu)了。Java 虛擬機(jī)也是在很早之前就退出了支持 64 位系統(tǒng)的版本派阱。但 Java 程序運(yùn)行在 64 位虛擬機(jī)上需要付出比較大的額外代價(jià):首先是 內(nèi)存問(wèn)題诬留,由于 指針膨脹 和各種 數(shù)據(jù)類型對(duì)齊補(bǔ)白 的原因,運(yùn)行于 64 位系統(tǒng)上的 Java 應(yīng)用需要消耗更多的內(nèi)存贫母,通常要比 32 位系統(tǒng)額外增加 10%-30% 的內(nèi)存消耗文兑;其次,多個(gè)機(jī)構(gòu)的測(cè)試結(jié)果顯示腺劣,64 位虛擬機(jī)的運(yùn)行速度在各個(gè)測(cè)試項(xiàng)中幾乎全面落后于 32 位虛擬機(jī)绿贞,兩者大約有 15% 左右的性能差距。

  • 但是在 Java EE 方面橘原,企業(yè)級(jí)應(yīng)用經(jīng)常需要使用超過(guò) 4GB 的內(nèi)存籍铁,對(duì)于 64 位虛擬機(jī)的需求是非常迫切的涡上,但由于上述原因,許多企業(yè)應(yīng)用仍然選擇使用虛擬集群等方式繼續(xù)在 32 位虛擬機(jī)中進(jìn)行部署拒名。Sun 也注意到了這些問(wèn)題吩愧,并做出了一些改善,在 JDK 1.6 Update14 之后增显,提供了普通對(duì)象指針壓縮同能(-XX:+ UseCompressedOops雁佳,這個(gè)參數(shù)不建議顯示設(shè)置,建議維持默認(rèn)由虛擬機(jī)的 Ergonomics 機(jī)制自動(dòng)開(kāi)啟)甸怕,在執(zhí)行代碼時(shí)甘穿,動(dòng)態(tài)植入壓縮指令以節(jié)省內(nèi)存消耗腮恩,但是開(kāi)啟壓縮指針會(huì)增加執(zhí)行代碼數(shù)量梢杭,因?yàn)樗性?Java 堆里的、指向 Java 堆對(duì)象的指針都會(huì)被壓縮秸滴,這些指針的訪問(wèn)就需要更多的代碼才可以實(shí)現(xiàn)武契,并且并不只是讀寫字段才受影響,在實(shí)例方法調(diào)用荡含、子類型檢查等操作中也受影響咒唆,因?yàn)閷?duì)象實(shí)例的引用也被壓縮了。隨著硬件的進(jìn)一步發(fā)展释液,計(jì)算機(jī)終究會(huì)完全過(guò)渡到 64 位的時(shí)代全释,這是一件毫無(wú)疑問(wèn)的事情,主流的虛擬機(jī)應(yīng)用也終究會(huì)從 32 位發(fā)展至 64 位误债,而虛擬機(jī)對(duì) 64 位的支持也將會(huì)進(jìn)一步完善浸船。


悄悄話 ??

  • 最近剛剛結(jié)束了 JavaSE 部分課程的學(xué)習(xí),趁著放假的時(shí)間深挖一下 Java 虛擬機(jī)李命,為后續(xù)的 Java 學(xué)習(xí)打下基礎(chǔ)箫老。計(jì)劃用 2 周的時(shí)間全面學(xué)習(xí)一下 《深入理解 Java 虛擬機(jī)》一書(shū),并且會(huì)將學(xué)習(xí)筆記分享到我的專題中阔籽。
  • 萬(wàn)事開(kāi)頭難牲蜀,這本書(shū)原作者在前言中也已經(jīng)寫到,本書(shū)的讀者應(yīng)該熟練掌握 Java 語(yǔ)言或者是有多年 Java 開(kāi)發(fā)經(jīng)驗(yàn)各薇,但是對(duì)于我一個(gè) Java 剛?cè)腴T的小白來(lái)說(shuō)讀起來(lái)可能會(huì)有一些困難君躺,所以我想要開(kāi)好這個(gè)頭棕叫,也為下面的學(xué)習(xí)鋪平道路
  • 第一章的內(nèi)容我是全部精讀了一遍然后寫出來(lái)的奕删,期間讀到了 Sun 公司在它的晚年時(shí)對(duì) Java 的 10 個(gè)里程碑設(shè)置俺泣,慨嘆 Java 開(kāi)發(fā)團(tuán)隊(duì)的管理者和工程師的前瞻性,也惋惜 Sun 公司對(duì) Java 的開(kāi)發(fā)因最終的資金完残、外部環(huán)境以及項(xiàng)目復(fù)雜度而最終流產(chǎn)伏钠。如果當(dāng)初的 Sun 公司能處理好技術(shù)之外的事情,并將原計(jì)劃的 JDK8 發(fā)布的話谨设,想象不到這之后的開(kāi)發(fā)語(yǔ)言會(huì)再次提升到什么樣的一個(gè)高度熟掂。除了對(duì) Java 語(yǔ)言的時(shí)代背景和技術(shù)背景的了解之外,也了解到了大量的關(guān)于虛擬機(jī)的一些基礎(chǔ)知識(shí)和編程語(yǔ)言發(fā)展前景扎拣,也許這些知識(shí)在開(kāi)發(fā)過(guò)程中不能明確指導(dǎo)我們的代碼編寫赴肚,但是卻拓展了我個(gè)人對(duì) Java 的了解,我覺(jué)得這也是一個(gè)作為開(kāi)發(fā)者來(lái)說(shuō)應(yīng)有的編程之外的基礎(chǔ)素養(yǎng)二蓝。
  • 之前關(guān)注了我的 JavaSE 成長(zhǎng)之路 專題的小伙伴誉券,接下來(lái)的幾天我也會(huì)將我之前的筆記整理出來(lái)陸續(xù)發(fā)布到這個(gè)專題之中,希望能和大家多多交流刊愚。

彩蛋 ??

  • 最近在拜讀同名一書(shū) 《深入理解 Java 虛擬機(jī)》并會(huì)與大家分享我的讀書(shū)筆記 深入理解 Java 虛擬機(jī)踊跟,有興趣的朋友可以一同交流進(jìn)步。

如果你覺(jué)得我的分享對(duì)你有幫助的話鸥诽,請(qǐng)?jiān)谙旅??隨手點(diǎn)個(gè)喜歡 ??商玫,你的肯定才是我最大的動(dòng)力,感謝衙传。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末决帖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蓖捶,更是在濱河造成了極大的恐慌地回,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俊鱼,死亡現(xiàn)場(chǎng)離奇詭異并闲,居然都是意外死亡帝火,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嗓违,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人偿洁,你說(shuō)我怎么就攤上這事涕滋『瘟撸” “怎么了瓣喊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵洪橘,是天一觀的道長(zhǎng)熄求。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卿城,這世上最難降的妖魔是什么瑟押? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任嫩舟,我火速辦了婚禮至壤,結(jié)果婚禮上像街,老公的妹妹穿的比我還像新娘。我一直安慰自己畴栖,他們只是感情好吗讶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布照皆。 她就那樣靜靜地躺著膜毁,像睡著了一般瘟滨。 火紅的嫁衣襯著肌膚如雪杂瘸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天绒怨,我揣著相機(jī)與錄音南蹂,去河邊找鬼六剥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛该默,可吹牛的內(nèi)容都是我干的栓袖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捧弃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼违霞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泌类,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枢希,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逗物,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡契邀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年微饥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欠橘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肃续。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疼蛾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情转唉,我是刑警寧澤麦轰,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布款侵,位于F島的核電站,受9級(jí)特大地震影響妹笆,放射性物質(zhì)發(fā)生泄漏拳缠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一切省、第九天 我趴在偏房一處隱蔽的房頂上張望朝捆。 院中可真熱鬧芙盘,春花似錦、人聲如沸驮樊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肥哎。三九已至篡诽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赊琳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埃碱。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓猖辫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砚殿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子啃憎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 姓名:周君會(huì) 學(xué)號(hào):17011210526 轉(zhuǎn)載自: http://www.reibang.com/p/...
    lotus兒閱讀 1,935評(píng)論 1 9
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(shū)(JVM)后必須掌握的部分。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,062評(píng)論 1 34
  • ---致意我愛(ài)的瀟雨 文/余爽 在童年似炎,你只是照片里虛擬的憧憬 嬉鬧之間辛萍,早晨或黃昏,你 見(jiàn)證我的歡笑和歌聲 后來(lái)...
    瀟雨_fca9閱讀 367評(píng)論 0 3
  • 扁鵲兄弟有三瘩扼,然世人只知扁鵲倒慧,扁鵲原文解釋為:”長(zhǎng)兄于病視神兰珍,未有形而除之唠摹,故名不出于家成肘。中兄治病店煞,其在毫毛,故名...
    巽迎論道閱讀 977評(píng)論 0 1
  • 好像成年后每長(zhǎng)大一年就會(huì)有不同的感悟涛舍,每長(zhǎng)大一年就貌似又懂了一些社會(huì)因素没佑,但是每長(zhǎng)大一年就好像對(duì)身邊的人情世故更加...
    享受孤獨(dú)的姑娘閱讀 142評(píng)論 0 0