1.1 概述java
1) Java 能得到如此普遍的承認,除了他擁有一門結構嚴謹,面向對象的編程語言以外,還有許多不可忽視的有點:Java 擺脫了硬件平臺的束縛,實現了「一次編寫,處處運行」的理想;他提供了一個相對安全的內存管理和訪問機制,避免了絕大部分的內存泄漏和指針越界問題;他實現了熱點代碼檢測和運行時編譯及優化,這使得 Java 應用能隨着運行時間的增長而得到更高的性能;他有一套完整的應用程序接口,還有無數來自商業結構和開源社區的第三方類庫來幫助他實現各類各樣的功能。正則表達式
1.2 Java技術體系算法
1) 從廣義上講,Clojure、Jruby、Groovy 等運行於 Java 虛擬機上的語言及其相關的程序都屬於 Java 技術體系中的一員。編程
若是從傳統意義上來看,Sun 官方所定義的 Java 技術體系包括如下幾個部分:小程序
Java 程序設計語言瀏覽器
各類硬件平臺上的 Java 虛擬機安全
Class 文件格式ruby
Java API 類庫服務器
來自商業機構和開源社區的第三方 Java 類庫架構
2) 咱們能夠把 Java 程序設計語言、Java 虛擬機、Java API 類庫這三部分統稱爲 JDK(Java Development Kit),JDK是用於支持 Java 程序開發的最小環境。另外,能夠把 Java API類庫中的 Java SE API 子集和 Java 虛擬機這兩部分統稱爲 JRE(Java Runtime Environment)。JRE 是支持 Java 程序運行的標準環境。
3) 根據各個組成部分的功能來進行劃分,Java 技術體系所包含的內容
4) 根據技術所服務的領域來劃分,或者說按照 Java 技術關注的重點業務領域來劃分,Java 技術體系能夠分爲4個平臺,分別爲:
Java Card: 支持一些 Java 小程序(Applets)運行在小內存設備(如智能卡)上的平臺
Java ME(Micro Edition): 支持 Java 程序運行在移動終端上的平臺,對 Java API 有所精簡,並加入了針對移動終端的支持,這個版本之前稱爲 J2ME
Java SE(Standard Edition): 支持面向桌面級應用(如 Windows 下的應用程序)的 Java平臺,提供了完整的 Java 核心 API,這個版本之前稱爲 J2SE
Java EE(Enterprise Editon): 支持使用多層框架的企業應用(如 ERP、CRM應用) 的Java 平臺,除了提供 Java SE API 外,還對其作了大量的擴充並提供了相關的部署支持,這個版本之前稱爲 J2EE
1.3 Java 發展史
1) Java 技術發展史
版本 | 描述 |
---|---|
1991年1月 | Sun公司成立了Green項目小組,專攻智能家電的嵌入式控制系統 |
1991年2月 | 放棄C++,開發新語言,命名爲「Oak」 |
1991年6月 | JamesGosling開發了Oak的解釋器 |
1992年1月 | Green完成了Green操做系統、Oak語言、類庫等開發 |
1992年11月 | Green計劃轉化成「FirstPerson」,一個Sun公司的全資母公司 |
1993年2月 | 得到時代華納的電視機頂盒交互系統的訂單,因而開發的重心從家庭消費電子產品轉到了電視盒機頂盒的相關平臺上。 |
1994年6月 | FirstPerson公司倒閉,員工都合併到Sun公司。Liveoak計劃啓動了,目標是使用Oak語言設計出一個操做系統。 |
1994年7月 | 第一個Java語言的Web瀏覽器WebRunner(後來更名爲HotJava),Oak改名爲Java。 |
1994年10月 | VanHoff編寫的Java編譯器用於Java語言 |
1995年3月 | 在SunWorld大會,Sun公司正式介紹了Java和HotJava。 |
1996年1月 | JDK1.0發佈 |
1997年2月 | J2SE1.1發佈 |
1998年12月 | J2SE1.2發佈 |
1999年6月 | 發佈Java的三個版本:J2SE、J2EE、J2ME |
2000年5月 | J2SE1.3發佈 |
2001年9月 | J2EE1.3發佈 |
2002年2月 | J2SE1.4發佈 |
2004年9月 | J2SE1.5發佈,將J2SE1.5更名JavaSE5.0 |
2005年6月 | JavaSE6.0發佈,J2EE改名爲JavaEE,J2SE改名爲JavaSE,J2ME改名爲JavaME |
2006年12月 | JRE6.0發佈 |
2006年12月 | JavaSE6發佈 |
2009年12月 | JavaEE6發佈 |
2009年4月 | Oracle收購Sun |
2011年7月 | JavaSE7發佈 |
2014年3月 | JavaSE8發佈 |
2) 1996年1月23日,JDK 1.0 發佈,Java 語言有了第一個正式版本的運行環境。JDK 1.0 提供了一個純解釋執行的 Java 虛擬機實現(Sun Classic VM)。JDK 1.0 版本的表明技術包括:Java 虛擬機、Applet、AWT等。
3) 1997年2月19日,Sun 公司發佈了 JDK 1.1,Java 技術的一些最基礎的支撐點(如 JDBC 等)都是在 JDK 1.1版本中發佈的, JDK 1.1版的技術表明有:JAR 文件格式、JDBC、JavaBeans、RMI。Java 語法也有了必定的發展,如內部類和反射都是在這個時候出現的。
4) 1998年4月8日,JDK 迎來了一個里程碑式的版本 JDK 1.2,工程代號爲 Playground(競技場),Sun 在這個版本中把 Java 技術體系拆分爲3個方向,分別是面向桌面應用開發的 J2SE(Java 2 Platform, Standard Edition),面向企業級開發的 J2EE(Java 2 Platform, Enterprise Edition)和麪向手機等移動終端開發的 J2ME(Java 2 Platform, Micro Edition)。在這個版本中出現的表明性技術很是多,如 EJB、Java Plug-in、Java IDL、Swing 等,而且這個版本中 Java虛擬機第一次內置了 JIT(Just In Time)編譯器(Java 1.2中曾並存過3個虛擬機,Classic VM、HotSpot VM 和 Exact VM,其中 Exact VM只在 Solaris 平臺出現過;後面兩個虛擬機都是內置 JIT 編譯器的,而以前版本所帶的 Classic VM 只能之外掛的形式使用 JIT 編譯器)。在語言和 API 級別上, Java 添加了 strictfp 關鍵字與如今 Java 編碼之中極爲經常使用分一系列 Collection 集合類。
5) 1999年4月27日,HotSpot 虛擬機發布,HotSpot 最初由一家名爲 「Longview Technologies」 的小公司開發,由於 HotSpot 的優異表現,這家公司在 1997 年被 Sun 公司受夠了。HotSpot 虛擬機發布時時做爲 JDK 1.2 的附加程序提供的,後來他成爲了 JDK 1.3 及以後全部版本的 Sun JDK 的默認虛擬機。
6) 2000年5月8日,工程代號爲 Kestrel 的 JDK 1.3發佈,JDK 1.3 相對於 JDK 1.2 的改進主要表如今一些類庫上(如數學運算和新的 Timer API 等),JNDI 服務從 JDK 1.3 開始被做爲一項平臺級服務提供(之前 JNDI 僅僅是一項擴展),使用 CORBA IIOP 來實現 RMI 的通訊協議,等等。這個版本還對 Java 2D 作了不少改進,提供了大量新的 Java 2D API,而且新添加了 JavaSound 類庫。
7) 2002年2月13日,JDK 1.4 發佈,工程代號爲 Merlin。JDK 1.4 是 Java 真正走向成熟的一個版本,Compaq、Fujitsu、SAS、Symbian、IBM 等著名公司都有參與甚至實現本身獨立的 JDK 1.4。哪怕是在十多年後的今天,仍然有許多主流應用(Spring、Hibernate、Struts等)能直接運行在 JDK 1.4 之上,或者繼續發佈能運行在 JDK 1.4 上的版本。JDK 1.4 一樣發佈了不少新的技術特性,如正則表達式、異常鏈、NIO、日誌類、XML 解析器和 XSLT 轉換器等。
8) 2004年9月30日,JDK 1.5 發佈,工程代號 Tiger。從 JDK 1.2 以來,Java 在語法層面上的變換一直很小,而 JDK 1.5 在 Java 語法易用性上作出了很是大的改進。例如,自動裝箱、泛型、動態註釋、枚舉、可變長參數、遍歷循環(foreach 循環)等語法特性都是在 JDK 1.5 中加入的。在虛擬機和 API 層面上,這個版本改進了 Java 的內存模型(Java Memory Model, JMM)、提供了 java.util.concurrent 併發包等。另外,JDK 1.5 是官方聲明能夠支持 Window 9x 平臺的最後一個 JDK 版本。
9) 2006年12月11日,JDK 1.6 發佈,工程代號 Mustang。在這個版本中,Sun 終結了從 JDK 1.2 開始已經有 8 年曆史的 J2EE、J2SE、J2ME 的命名方式,啓用 Java SE 六、Java EE 六、Java ME 6 的命名方式。JDK 1.6 的改進包括:提供動態語言支持(經過內置 Mozilla JavaScript Rhino 引擎實現)、提供編譯 API 和微型 HTTP 服務器 API 等。同時,這個版本對 Java 虛擬機內部作了大量改進,包括鎖與同步、垃圾收集、類加載等方面的算法都有至關多的改動。
10) 在2006年11月13日的 JavaOne大會上,Sun 公司宣佈最終會將 Java 開源,並在隨後的一年多的時間內,陸續將 JDK 的各個部分在GPL v2(GNU General Public License v2) 協議下公開了源碼,並創建了 OpenJDK 組織對這些源碼進行獨立管理。除了極少許的產權代碼(Encumbered Code,這部分代碼大可能是 Sun 自己也無權限進行開元處理的)外,OpenJDK 幾乎包括了 Sun JDK 的所有代碼, OpenJDK 的質量主管曾經表示,在 JDK 1.7中,Sun JDK 和 OpenJDK 除了代碼和文件頭的版權只是以外,代碼基本上徹底同樣,因此 OpenJDK 7 與 Sun JDK 1.7 本質上就是同一套代碼庫開發的產品。
11) JDK 1.7 的主要改進包括:提供新的 G1 收集器(G1 在發佈時依然處於 Experimental 狀態,直至2014年4月的Update 4中才正式莊正)、增強對非 Java 語言的調用支持(ISR-292,這項特性到目前爲止依然沒有徹底實現定型)、升級類加載架構等。
12) 2009年4月20日,Oracle 公司收購了 Sun 公司,Java 商標今後正式歸 Oracle 全部(Java 自己並不屬於那間公司全部,他由 JCP 組織進行管理,儘管 JCP 主要是由 Sun公司或者說 Oracle 公司所領導的)。因爲此前 Oracle 公司已經收購了另一家大型的中間件企業 BEA 公司,在完成對 Sun 公司的收購以後, Oracle 公司分別送 BEA 和 Sun 中取得了目前三大商業虛擬機的其中兩個:JRockit 和 HotSpot,Oracle 公司宣佈在將來的1~2年的時間將把這兩個優秀的虛擬機互相取長補短,最終合二爲一。
1.4 Java 虛擬機發展史
1) Sun Classic / Exact VM
1996年1月23日,Sun 公司發佈 JDK 1.0,Java 語言首次擁有了商用的正式運行環境,這個 JDK 中所帶的虛擬機就是Classic VM。這款虛擬機只能使用純解釋器方式來執行 Java 代碼,若是要使用 JIT 編譯器,就必須進行外掛。可是假如外掛了 JIT 編譯器,JIT 編譯器就徹底接管了虛擬機的執行系統,解釋器變再也不工做了。
其餘相似的外掛編譯器還有 Symantec JIT 和 shuJIT 等。因爲解釋器和編譯器不能配合工做,這就意味着若是要使用編譯器執行,編譯器就不得不對每個方法、每一行代碼都進行編譯,而不管他們執行的頻率是否具備編譯的價值。基於程序響應時間的壓力,這些編譯器根本不敢應用編譯耗時稍高的優化技術,所以這個階段的虛擬機即便用了 JIT 編譯器輸出本地代碼,執行效率也和傳統的 C/C++ 程序有很大的差距。
在 JDK 1.2 時,曾在 Solaris 平臺上發佈過一款名爲 Exact VM 的虛擬機,他的執行系統已經具有現代高性能虛擬機的雛形:如兩級即時編譯器、編譯器與解釋器混合工做模式等。Exact VM 因它使用準確式內存管理(Exact Memory Management,也能夠叫 Non-Conservative/Accurate Memory Management)而得名,即虛擬機能夠知道內存中某個位置的數據具體是什麼類型。因爲使用了準確是內存管理,Exact VM 能夠拋棄之前 Classic VM基於 handler 的對象查找方式(緣由是進行 GC 後對象可能會被移動位置)。
雖然 Exact VM 的技術相對 Classic VM 來講先進了許多,可是在商業應用上只存在了很短暫的時間就被更爲優秀的 HotSpot VM 所取代,甚至還沒來得及發佈 Windows 和 Linux 平臺下的商用版本。而Classic VM 的生命週期則相對長了許多,他在 JDK 1.2 以前是 Sun JDK 中惟一的虛擬機,在 JDK 1.2 時,他與 HotSpot VM 並存,但默認使用的是 Classic VM(用戶可用 java-hotspot 參數切換至 HotSpot VM),而在 JDK 1.3 時,HotSpot VM 稱爲默認虛擬機,但 Classic VM 仍做爲虛擬機的備用選擇發佈(使用 java-classic 參數切換),知道 JDK 1.4 的時候,Classic VM 才徹底退出商用虛擬機的歷史舞臺,與 Exact VM 一塊兒進入了 Sun Labs Research VM 之中。
2) Sun HotSpot VM
Sun HotSpot VM 是 Sun JDK 和 Open JDK 中所帶的虛擬機,也是目前使用範圍最廣的 Java 虛擬機,這個虛擬機最初是由一家名爲 "LongviewTechnologies" 的小公司設計的,最初並不是是爲 Java 語言而開發的,他來源於 Strongtalk VM,而這款虛擬機中至關多的技術又是來源於一款支持 Self 語言實現 "達到 C 語言50% 以上的執行效率"的目標而設計實現的虛擬機, Sun 公司於1997年收購了 Longview Technologies 公司,從而得到了 HotSpot VM。
HotSpot VM 既繼承了 Sun 以前兩款商用虛擬機的優勢,也有許多本身新的技術優點,如他名稱中的 HotSpot 指的就是他的熱點代碼探測技術(其實兩個 VM 基本上是同時期的獨立產品,HotSpot 一開始就是準確式 GC,而 Exact VM 之中也有與 HotSpot 幾乎同樣的熱點探測,爲了 Exact VM 和 HotSpot VM 哪一個稱爲 Sun主要支持的產品,在 Sun 公司內部還有過爭論,HotSpot 戰勝 Exact VM 並不能算技術上的勝利),HotSpot VM 的熱點代碼探測能力能夠經過執行計數器找出最具備編譯價值的代碼,而後經過 JIT 編譯器以方法爲單位進行編譯。若是一個方法被頻繁調用,或方法中有效循環次數不少,將會分別觸發標準編譯和 OSR (棧上替換)編譯動做。經過編譯器和解釋器恰當地協同工做,能夠在最優化的程序相應時間與最佳執行性能中取得平衡,並且無須等待本地代碼輸出才能執行程序,即時編譯的時間壓力也相對減少,這樣有助於引入更多的代碼優化技術,輸出質量更高的本地代碼。
在2006年的 JavaOne 大會上,Sun 公司宣佈最終會把 Java 開源,並在隨後的一年,陸續將 JDK 的各個部分(其中固然也包括了 HotSpot VM)在 GPL 協議下公佈了源碼,並在此基礎上創建了 OpenJDK。這樣,HotSpot VM 便成爲了 Sun JDK 和 OpenJDK 兩個實現極度接近的 JDK 項目的共同虛擬機。
在2008年和2009年,Oracle 公司分別收購了 BEA 公司和 Sun 公司,這樣 Oracle 公司同時擁有了兩款優秀的 Java 虛擬機:JRockit VM 和 HotSpot VM。Oracle 公司宣佈在不久的未來會完成這兩款虛擬機的整合工做,使之優點互補。
3) Sun Mobile-Embedded VM/Meta-Circular VM