天天看點

【深入了解JVM-走進Java】

出來工作了幾個月後,發現對java高階知識了解的還是不夠深,沒畢業就買了一本<深入了解java虛拟機>到現在也就粗略看了也就兩三章。于是決定通過做筆記的方式再次學習下。梳理下知識體系,了解下深入知識。

一、java技術體系

1、官方定義

Sun官方定義的java技術體系包括:

1、java 語言

2、各個硬體平台的java虛拟機

3、Class檔案的格式

4、Java API類庫

5、商業機構和第三方的java類庫

2、技術體系的劃分方式

java技術體系兩種劃分方式:
  • 按照各個組分的功能劃分
  • 按照技術服務領域劃分

3、功能上劃分

(1)組分的部分功能

jdk:(java development kit) java開發工具包

jre:(Java Runtime Environment)java運作環境。

jvm:(java virtual machine ) java虛拟機

(2)之間具體關系圖(如下)

【深入了解JVM-走進Java】

1、可以看出jdk包含jre。

2、jre包含jvm

4、技術服務領域劃分

也就是按照java技術關注的重點業務領域劃分:

1、java Card 支援一些java程式(Applets)運作在小記憶體裝置(如智能卡)上面的平台。

2、java ME(Micro Edition)支援java程式運作在移動終端上的平台,對java api有所精簡,并加入了針對移動終端的支援這個版本以前稱為J2ME。

3、java SE(Standard Edition)支援面向桌面級應用(如window下的應用程式)的java平台,提供完整java 核心api,這個版本以前稱為J2SE。

4、jaca EE

(Enterprise Edition) 支援使用多層架構的企業應用,(如ERP,CRM 應用)的平台,除了提供javase的api外還對其進行了大量的擴充,并提供了相關的部署支援,這個版本以前稱為J2EE。

二、java的發展史

1、由來

(1)創始人

我們java的祖師爺:James Gosling(詹姆斯高斯林)。

java 前身:Oak(橡樹),1995-5-23改名為java ,正式釋出java1.0版本。

2、jdk的曆史版本

這裡主要總結下對應版本出現的重要技術等…
  • 1996-1-23 jdk1.0:提供了純解釋型虛拟機(Sun Classic vm),代表技術,java虛拟機,Applets Awt等。(提出口号一次編譯、多出運作)
  • 1997-2-19 jdk1.1:提供了java技術的最基礎支援代表技術JDBC,JavaBeans,RMI。java文法也得到了發展如出現了内部類,反射。
  • 1998-12-4 jdk1.2:Sun 在這個版本中吧java技術拆分為三個方向:J2SE,J2ME,J2EE。這個版本出現了很多技術,如EJB,java Plug-in,java IDL,Swing。 這個版本的中虛拟機中内置了JIT(just in time)編譯器。添加了strictfp關鍵字以及Collections集合工具類。
  • 1999-4-27 HotSpot虛拟機釋出(釋出時作為jdk1.2的附加程式提供),HotSpot虛拟機成為jdk1.3版本及之後所有版本的預設虛拟機。
  • 2000-5-8 jdk1.3:1.3版本相對1.2版本的改進主要表現在一些類庫上(如數學運算好新的Timer API 等),JNID服務從jdk1.3開始作為一項平台級服務提供(以前jnid僅僅是一項擴充),使用CORBA IIOP來實作RMI的通信協定,等等。還提拱了大量的新的java 2D API ,添加了javaSound 類庫。
  • 2002-2-13 jdk1.4釋出,1.4版本是java真正走向成熟的一個版本,很多有名的公司都有參與,甚至獨立實作了自己的jdk1.4,直到現在,主流的架構(Spring, Hibernate,Struts)都能直接運作在jdk1.4或者1.4之上版本運作。1.4的一些新特性:正規表達式,異常鍊,NIO,日之類,XML解析器和XLST轉換器等。
  • 2004-9-30 jdk1.5釋出 ,1.2版本到1.5版本文法層面上的變換很小,而jdk1.5在文法易用性上面做了非常大的改進,例如自動裝箱,泛型,動态注解,枚舉可變參數,周遊循環(foreach)等文法都是1.5加入的。提供了java.util.concurrent并發包。(1.5版本之後不再支援windows 9x)
  • 2006-12-11 jdk1.6版本,Sun終結了從jdk1.2 版本開始已經有八年的J2SE,j2EE,J2ME,的命名方式。啟用J2SE6,j2EE6,J2ME6的命名方式。jdk1.6的新特性:提供動态語言支援(通過内置的Mozilla javaScript Rhino引擎實作),提供編譯api 和微型的Http伺服器等APi。同時這個版本針對虛拟機内部做了大量的改進,包括鎖與同步,垃圾收集,類加載等方面的算法都有相當多的改動。
  • 2006 年11月13日的javaOne大會上Sun公司宣布将java開源,同時建立了Openjdk組織對這些源碼進行獨立的管理,除了及其少量的産權代碼外,Openjdk 幾乎包含了SunJdk的全部代碼,在jdk1.7中Sunjdk和OpenJdk除了代碼檔案頭的版權注釋之外,代碼基本上完全一樣。是以Openjdk7和SunJdk7本質上就是同一套代碼庫開發的産品。
  • 2009-2-19 1.7的功能規劃完成,由于各種原因之後Sun被Oracle收購,直到2011-7-28釋出了oracle釋出1.7版本,1.7的特性:提供了新的G1收集器,加強對非java語言的調用支援,更新類加載架構等。
  • 2009-4-20 Oracle公司宣布以74億美元價格收購Sun公司。
  • 最新的java SE 7 Update9與2012年10月16日釋出,從java SE 7 Update4開始oracle 開始支援Mac OS X作業系統,并在Update6中達到完全支援的程度,同時Update6中還對ARM指令集架構提供了支援,至此官方提供的jdk可以運作于Windows(不含windows 9 X)Linux,Solaris,Mac OS平台上,支援ARM,X86, X64和Sparc指令集架構類型。
  • 2014-jdk8:出現了Lambda表達式和函數式接口接口的預設方法和靜态方法、Streams、Date/Time API(JSR 310)、Base64(對Base64編碼的支援已經被加入到Java 8官方庫中,這樣不需要使用第三方庫就可以進行Base64編碼)
目前java已經更新到13但是企業使用最多的還是java8,這裡就先總結到8。。。

三、jvm發展史

1、 Sun Classic / Exact VM

Sun Classic

世界上第一款商用 Java 虛拟機;隻能使用純解釋器方式來執行 Java 代碼,也可以使用外挂JIT編譯器,JIT 會完全接管虛拟機的執行系統,但是此時解釋器不會再工作了;JDK1.2之前是 Sun JDK 中唯一的虛拟機,JDK1.4 時,完全退出商用虛拟機的曆史舞台,與 Exact VM 一起進入了Sun Labs Research VM。

Exact VM

它的執行系統已經具備了現代高性能虛拟機的雛形:如兩級即時編譯器、編譯器與解析器混合工作模式等;

使用準确式記憶體管理:虛拟機可以知道記憶體中某個位置的資料具體是什麼類型。

有與 HotSpot 幾乎一樣的熱點探測;

在商業應用上隻存在了很短暫的時間就被更優秀的 HotSpot VM 所取代。

2 、Sun HotSpot VM

它是 Sun JDK 和 OpenJDK 中所帶的虛拟機,也是目前使用範圍最廣的 Java 虛拟機;

繼承了 Sun 之前兩款商用虛拟機的優點(如準确式記憶體管理),也使用了許多自己新的技術優勢,如熱點代碼探測技術(通過執行計數器找出最具有編譯價值的代碼,然後通知 JIT 編譯器以方法為機關進行編譯);如果一個方法被頻繁調用或者方法中有效循環次數很多,将會分别觸發标準編譯和OSR(棧上替換)編譯動作。讓編譯器和解釋器恰當的協同工作。可以在最優化的程式響應時間與最佳執行性能中取得平衡。而且無需等待本地代碼輸出才能執行程式,及時編譯的時間壓力相對減少。

Oracle 公司分别收購了 BEA 和 Sun,并在 JDK8 的時候,整合了 JRokit VM 和 HotSpot VM,如使用了 JRokit 的垃圾回收器與 MissionControl 服務,使用了 HotSpot 的 JIT 編譯器與混合的運作時系統。

3 、Sun Mobile-Embedded VM / Meta-Circular VM

sun 公司不僅出了面向桌面、伺服器領域的虛拟機還出了其他領域的虛拟機如下:

KVM:

在 Android、IOS 等智能手機作業系統出現前,曾在手機平台上得到非常廣泛的應用。

CDC / CLDC HotSpot Implementation:整個Java ME 的重要支柱,但是在 Android 和 IOS 二分天下的移動數字裝置市場看來,其面臨的局面不容樂觀。
Squawk VM:運作于 Sun SPOT(一種手持的WiFi裝置),也曾運用于 Java Card,是一個 Java 代碼比重很高的嵌入式虛拟機實作。
JavaInJava:一個實驗室性質的虛拟機,試圖以 Java 語言來實作 Java 語言本身的運作環境。它必須運作在另外一個宿主虛拟機之上,内部沒有 JIT 編譯器,代碼隻能以解釋模式執行。
Maxine VM:與 JavaInJava 非常相似,它有着先進的 JIT 編譯器和垃圾收集器(但沒有解析器),可在宿主模式或獨立模式下執行,其執行效率已經接近了 HotSpot Client VM 的水準。

4 、BEA JRockit / IBM J9 VM(非sun公司出的虛拟機)

BEA公司JRockit VM:

号稱“世界上速度最快的 Java 虛拟機”(廣告詞);一款專門為伺服器硬體和伺服器端應用場景高度優化的虛拟機,由于專注于伺服器端應用,可以不太關注程式啟動速度,是以 JRockit 内部不包含解釋器實作,全部代碼靠即時編譯器編譯後執行,除此之外,JRockit 的垃圾收集器和 MissionControl 服務套件等部分的實作,在衆多 Java 虛拟機中也一直處于領先水準。

IBM J9 VM:

市場定位與 Sun HotSpot 比較接近,是一款設計上從伺服器端到桌面應用再到嵌入式都全面考慮的多用途虛拟機;

其開發的目的:作為 IBM 公司各種 Java 産品的執行平台。

5 Azul VM / BEA Liquid VM

我們平時所說的“高性能 Java 虛拟機”一般是指 HotSpot、JRockit、J9 這類在通用平台上運作的商用虛拟機,但其實 Azul VM 和 BEA Liquid VM 這類特定硬體平台專有的虛拟機才是“高性能”的武器。

Azul VM

在 HotSpot 基礎上進行大量改進,運作于 Azul Systems 公司的專有硬體 Vega 系統上的 Java 虛拟機,每個 Azul VM 執行個體都可以管理至少數十個 CPU 和數百 GB 記憶體的硬體資源,并提供在巨大範文内實作可控的 GC 時間的垃圾收集器、為專有硬體優化的線程排程等優秀特性;

Liquid VM:

即是現在的 JRockit VE(Virtual Edition),是 BEA 公司開發的,可以直接運作在自家的 Hypervisor 系統上的 Jrockit VM 的虛拟化版本。它不需要作業系統的支援,或者說它自己本身實作了一個專有作業系統的必要功能,如檔案系統、網絡支援等。由虛拟機越過通用作業系統直接控制硬體可以獲得很多好處,如線上程排程時,不需要再進行核态/使用者态的切換等,這樣可以最大限度的發揮硬體的能力,提升 Java 程式的執行性能。

6 、Apache Harmony / Google Android Dalvik VM

它們隻能稱為“虛拟機”,而不能稱為“Java 虛拟機”。

Apache Harmony:是一個 Apache 軟體基金會旗下以 Apache License 協定開源的實際相容于 JDK1.5 和 JDK1.6 的 Java 程式運作平台。包含自己的虛拟機和java庫。但是沒有通過TCK認證(若果一個公司宣布相容java語言那必須通過這個認證)雖然Apache Harmony沒有經過TCK認證但是他的許多代碼(基本上是java庫部分的代碼)被吸納IBM的JDK7實作以及google android sdk中,尤其對安卓的發展起到重要作用.

Dalvik VM

1、是 Android 平台的核心組成部分之一。

2、名字由來冰島的小漁村名。

3、沒有遵循 Java 虛拟機規範,不能直接執行 Java 的 Class 檔案,使用的是寄存器架構而不是 JVM 中常見的棧架構。

4、它執行的 dex(Dalvik Executable)檔案可以通過 Class 檔案轉化而來。

5、android2.2提供即時編譯器,直行性能大大提高。

7 、Microsoft JVM 及其他

除了上面大量被商業使用的jvm外還有些不為人知或者曾經絢麗最終湮滅的jvm。

Microsoft JVM

微軟公司曾經是java技術的鐵杆支援者。java語言誕生的初期(jdk1.2為界),他的主要應用就是在浏覽器的運作java Applets程式。微軟公司為了在 IE3 中支援 Java Applets 應用而開發了自己的 Java 虛拟機,雖然這款虛拟機隻有 Windows 平台的版本,卻是當時 Windows 下性能最好的 Java 虛拟機。但是好景不長,1997年sun控告微軟侵犯商标、不正當競争最終微軟賠了10億美元給sun。

其他的jvm

JamVM、cacaovm、SableVM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM、Jikes RVM。

四、展望java技術未來

1、子產品化

解決應用系統與技術平台之間越來複雜、越來龐大問題的重要途徑。

2、混合多語言

1、單一的java開發無法滿足目前軟體的複雜需求時,越來越多的基于java虛拟機的語言開發被應用到項目中。java平台上多語言混合正成為主流、最終這些語言運作在同一個虛拟機上。

2、近年來運作在java虛拟機上的語言在迅速增長,一些新的語言還有老語言也出現了基于java虛拟機的實作版本(如下圖檔來源網絡)

【深入了解JVM-走進Java】

3、多核并行

1、如今CPU硬體發展方向:從高頻率向多核心發展

2、随着多核時代的來臨軟體開發越來越關注并行程式設計的領域。jdk1.5添加了并發包,而在1.7中并發包中又添加forkjoin包。進一次對并發包擴充。Fork/Join模式是處理并發程式設計的一個經典方法。這個模式雖然不能解決所有的問題但是在此模式适用的範圍内能輕松利用多個cpu核心提供的計算資源來寫作完成一個複雜的任務。

3、java8添加了lambda,函數式程式設計的重要優點就是程式天然的适合并行運作

4、目前顯示卡的算術運算能力并行能力已經遠超cpu。在圖形領域以外發掘顯示卡的潛力是近幾年計算機發展的方向之一。例如c語言的CUDA、OpenJdk的子項目Sumatra。Sumatra項目就是為java提供使用GPU(Graphics Processing Units)和APU(Accelerated Processing Units)運算工具,以後将會提供直接java層的api或者為Lambda或者其他語言直接提供底層并行運算支援。

4、在jdk範圍外也出現了為滿足并行計算而出現的架構如Apache的Hadoop、Map Reduce。這是簡單易懂的并行架構,能夠運作在由成千上萬個商用機器組成的大型叢集上。以可靠容錯方式并行處理TB級别資料。另外還出現了例如Scala、Clojure、Erlang天然具有并行計算能力的語言。

4、64位虛拟機的支援

1、jvm在作業系統推出64位系統後,也添加64為的虛拟機支援。但是前期效果不是很好,在64位上虛拟機消耗記憶體同等下比32位增加了10%-30%、運作速度也落後32位。但是javaEE方面好多企業都使用超4G的記憶體對于64位的虛拟機需求迫切。由于以上原因,許多企業仍然選擇虛拟叢集的等方式繼續在32位的虛拟機中進行部署。

2、未來64位的虛拟機也在逐漸完善

5、源碼編譯

參看<深入了解jvm虛拟機>課本

The End

發現對java的認識又加深了不少。。。。。。