日本免费精品视频,男人的天堂在线免费视频,成人久久久精品乱码一区二区三区,高清成人爽a毛片免费网站

在線客服
深入理解Java虛擬機:JVM高級特性與實踐(第2版)圖書
人氣:163

深入理解Java虛擬機:JVM高級特性與實踐(第2版)

全書共分為五大部分,圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、程序編譯與優(yōu)化、高效并發(fā)等核心主題對JVM進行了而深入的分析,深刻揭示了JVM的工作原理。

內(nèi)容簡介

本書第1版兩年內(nèi)印刷近10次,4家網(wǎng)上書店的評論近4?000條,98%以上的評論全部為5星級的好評,是整個Java圖書領域公認的經(jīng)典著作和超級暢銷書,繁體版在臺灣也十分受歡迎。第2版在第1版的基礎上做了很大的改進:根據(jù)的JDK 1.7對全書內(nèi)容進行了的升級和補充;增加了大量處理各種常見JVM問題的技巧和實踐;增加了若干與生產(chǎn)環(huán)境相結合的實戰(zhàn)案例;對第1版中的錯誤和不足之處的修正;等等。第2版不僅技術更新、內(nèi)容更豐富,而且實戰(zhàn)性更強。

全書共分為五大部分,圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、程序編譯與優(yōu)化、高效并發(fā)等核心主題對JVM進行了而深入的分析,深刻揭示了JVM的工作原理。及時部分從宏觀的角度介紹了整個Java技術體系、Java和JVM的發(fā)展歷程、模塊化,以及JDK的編譯,這對理解本書后面內(nèi)容有重要幫助。第二部分講解了JVM的自動內(nèi)存管理,包括虛擬機內(nèi)存區(qū)域的劃分原理以及各種內(nèi)存溢出異常產(chǎn)生的原因;常見的垃圾收集算法以及垃圾收集器的特點和工作原理;常見虛擬機監(jiān)控與故障處理工具的原理和使用方法。第三部分分析了虛擬機的執(zhí)行子系統(tǒng),包括類文件結構、虛擬機類加載機制、虛擬機字節(jié)碼執(zhí)行引擎。第四部分講解了程序的編譯與代碼的優(yōu)化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理;講解了虛擬機的熱點探測方法、HotSpot的即時編譯器、編譯觸發(fā)條件,以及如何從虛擬機外部觀察和分析JIT編譯的數(shù)據(jù)和結果;第五部分探討了Java實現(xiàn)高效并發(fā)的原理,包括JVM內(nèi)存模型的結構和操作;原子性、可見性和有序性在Java內(nèi)存模型中的體現(xiàn);先行發(fā)生原則的規(guī)則和使用;線程在Java語言中的實現(xiàn)原理;虛擬機實現(xiàn)高效并發(fā)所做的一系列鎖優(yōu)化措施。

編輯推薦

本書第1版兩年內(nèi)印刷近10次,4家網(wǎng)上書店的評論近4?000條,98%以上的評論全部為5星級的好評,是整個Java圖書領域公認的經(jīng)典著作和超級暢銷書,繁體版在臺灣也十分受歡迎。第2版在第1版的基礎上做了很大的改進:根據(jù)的JDK 1.7對全書內(nèi)容進行了的升級和補充;增加了大量處理各種常見JVM問題的技巧和實踐;增加了若干與生產(chǎn)環(huán)境相結合的實戰(zhàn)案例;對第1版中的錯誤和不足之處的修正;等等。第2版不僅技術更新、內(nèi)容更豐富,而且實戰(zhàn)性更強。

目錄

前言

及時部分走近Java

第1章走近Java

1.1概述

1.2Java技術體系

1.3Java發(fā)展史

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

1.4.1Sun Classic Exact VM

1.4.2Sun HotSpot VM

1.4.3Sun Mobile-Embedded VM Meta-Circular VM

1.4.4BEA JRockit IBM J9 VM

1.4.5Azul VM BEA Liquid VM

1.4.6Apache Harmony Google Android Dalvik VM

1.4.7Microsoft JVM及其他

1.5展望Java技術的未來

1.5.1模塊化

1.5.2混合語言

1.5.3多核并行

1.5.4進一步豐富語法

1.5.564位虛擬機

1.6實戰(zhàn):自己編譯JDK

1.6.1獲取JDK源碼

1.6.2系統(tǒng)需求

1.6.3構建編譯環(huán)境

1.6.4進行編譯

1.6.5在IDE工具中進行源碼調(diào)試

1.7本章小結

第二部分自動內(nèi)存管理機制

第2章Java內(nèi)存區(qū)域與內(nèi)存溢出異常

2.1概述

2.2運行時數(shù)據(jù)區(qū)域

2.2.1程序計數(shù)器

2.2.2Java虛擬機棧

2.2.3本地方法棧

2.2.4Java堆

2.2.5方法區(qū)

2.2.6運行時常量池

2.2.7直接內(nèi)存

2.3HotSpot虛擬機對象探秘

2.3.1對象的創(chuàng)建

2.3.2對象的內(nèi)存布局

2.3.3對象的訪問定位

2.4實戰(zhàn):OutOfMemoryError異常

2.4.1Java堆溢出

2.4.2虛擬機棧和本地方法棧溢出

2.4.3方法區(qū)和運行時常量池溢出

2.4.4本機直接內(nèi)存溢出

2.5本章小結

第3章垃圾收集器與內(nèi)存分配策略

3.1概述

3.2對象已死嗎

3.2.1引用計數(shù)算法

3.2.2可達性分析算法

3.2.3再談引用

3.2.4生存還是死亡

3.2.5回收方法區(qū)

3.3垃圾收集算法

3.3.1標記-清除算法

3.3.2復制算法

3.3.3標記-整理算法

3.3.4分代收集算法

3.4HotSpot的算法實現(xiàn)

3.4.1枚舉根節(jié)點

3.4.2安全點

3.4.3安全區(qū)域

3.5垃圾收集器

3.5.1Serial收集器

3.5.2ParNew收集器

3.5.3Parallel Scavenge收集器

3.5.4Serial Old收集器

3.5.5Parallel Old收集器

3.5.6CMS收集器

3.5.7G1收集器

3.5.8理解GC日志

3.5.9垃圾收集器參數(shù)總結

3.6內(nèi)存分配與回收策略

3.6.1對象優(yōu)先在Eden分配

3.6.2大對象直接進入老年代

3.6.3長期存活的對象將進入老年代

3.6.4動態(tài)對象年齡判定

3.6.5空間分配擔保

3.7本章小結

第4章虛擬機性能監(jiān)控與故障處理工具

4.1概述

4.2JDK的命令行工具

4.2.1jps:虛擬機進程狀況工具

4.2.2jstat:虛擬機統(tǒng)計信息監(jiān)視工具

4.2.3jinfo:Java配置信息工具

4.2.4jmap:Java內(nèi)存映像工具

4.2.5jhat:虛擬機堆轉儲快照分析工具

4.2.6jstack:Java堆棧跟蹤工具

4.2.7HSDIS:JIT生成代碼反匯編

4.3JDK的可視化工具

4.3.1JConsole:Java監(jiān)視與管理控制臺

4.3.2VisualVM:多合一故障處理工具

4.4本章小結

第5章調(diào)優(yōu)案例分析與實戰(zhàn)

5.1概述

5.2案例分析

5.2.1高性能硬件上的程序部署策略

5.2.2集群間同步導致的內(nèi)存溢出

5.2.3堆外內(nèi)存導致的溢出錯誤

5.2.4外部命令導致系統(tǒng)緩慢

5.2.5服務器JVM進程崩潰

5.2.6不恰當數(shù)據(jù)結構導致內(nèi)存占用過大

5.2.7由Windows虛擬內(nèi)存導致的長時間停頓

5.3實戰(zhàn):Eclipse運行速度調(diào)優(yōu)

5.3.1調(diào)優(yōu)前的程序運行狀態(tài)

5.3.2升級JDK 1.6的性能變化及兼容問題

5.3.3編譯時間和類加載時間的優(yōu)化

5.3.4調(diào)整內(nèi)存設置控制垃圾收集頻率

5.3.5選擇收集器降低延遲

5.4本章小結

第三部分虛擬機執(zhí)行子系統(tǒng)

第6章類文件結構

6.1概述

6.2無關性的基石

6.3Class類文件的結構

6.3.1魔數(shù)與Class文件的版本

6.3.2常量池

6.3.3訪問標志

6.3.4類索引、父類索引與接口索引集合

6.3.5字段表集合

6.3.6方法表集合

6.3.7屬性表集合

6.4字節(jié)碼指令簡介

6.4.1字節(jié)碼與數(shù)據(jù)類型

6.4.2加載和存儲指令

6.4.3運算指令

6.4.4類型轉換指令

6.4.5對象創(chuàng)建與訪問指令

6.4.6操作數(shù)棧管理指令

6.4.7控制轉移指令

6.4.8方法調(diào)用和返回指令

6.4.9異常處理指令

6.4.10同步指令

6.5公有設計和私有實現(xiàn)

6.6Class文件結構的發(fā)展

6.7本章小結

第7章虛擬機類加載機制

7.1概述

7.2類加載的時機

7.3類加載的過程

7.3.1加載

7.3.2驗證

7.3.3準備

7.3.4解析

7.3.5初始化

7.4類加載器

7.4.1類與類加載器

7.4.2雙親委派模型

7.4.3破壞雙親委派模型

7.5本章小結

第8章虛擬機字節(jié)碼執(zhí)行引擎

8.1概述

8.2運行時棧幀結構

8.2.1局部變量表

8.2.2操作數(shù)棧

8.2.3動態(tài)連接

8.2.4方法返回地址

8.2.5附加信息

8.3方法調(diào)用

8.3.1解析

8.3.2分派

8.3.3動態(tài)類型語言支持

8.4基于棧的字節(jié)碼解釋執(zhí)行引擎

8.4.1解釋執(zhí)行

8.4.2基于棧的指令集與基于寄存器的指令集

8.4.3基于棧的解釋器執(zhí)行過程

8.5本章小結

第9章類加載及執(zhí)行子系統(tǒng)的案例與實戰(zhàn)

9.1概述

9.2案例分析

9.2.1Tomcat:正統(tǒng)的類加載器架構

9.2.2OSGi:靈活的類加載器架構

9.2.3字節(jié)碼生成技術與動態(tài)的實現(xiàn)

9.2.4Retrotranslator:跨越JDK版本

9.3實戰(zhàn):自己動手實現(xiàn)遠程執(zhí)行功能

9.3.1目標

9.3.2思路

9.3.3實現(xiàn)

9.3.4驗證

9.4本章小結

第四部分程序編譯與代碼優(yōu)化

第10章早期(編譯期)優(yōu)化

10.1概述

10.2Javac編譯器

10.2.1Javac的源碼與調(diào)試

10.2.2解析與填充符號表

10.2.3注解處理器

10.2.4語義分析與字節(jié)碼生成

10.3Java語法糖的味道

10.3.1泛型與類型擦除

10.3.2自動裝箱、拆箱與遍歷循環(huán)

10.3.3條件編譯

10.4實戰(zhàn):插入式注解處理器

10.4.1實戰(zhàn)目標

10.4.2代碼實現(xiàn)

10.4.3運行與測試

10.4.4其他應用案例

10.5本章小結

第11章晚期(運行期)優(yōu)化

11.1概述

11.2HotSpot虛擬機內(nèi)的即時編譯器

11.2.1解釋器與編譯器

11.2.2編譯對象與觸發(fā)條件

11.2.3編譯過程

11.2.4查看及分析即時編譯結果

11.3編譯優(yōu)化技術

11.3.1優(yōu)化技術概覽

11.3.2公共子表達式消除

11.3.3數(shù)組邊界檢查消除

11.3.4方法內(nèi)聯(lián)

11.3.5逃逸分析

11.4Java與CC++的編譯器對比

11.5本章小結

第五部分高效并發(fā)

第12章Java內(nèi)存模型與線程

12.1概述

12.2硬件的效率與一致性

12.3Java內(nèi)存模型

12.3.1主內(nèi)存與工作內(nèi)存

12.3.2內(nèi)存間交互操作

12.3.3對于volatile型變量的特殊規(guī)則

12.3.4對于long和double型變量的特殊規(guī)則

12.3.5原子性、可見性與有序性

12.3.6先行發(fā)生原則

12.4Java與線程

12.4.1線程的實現(xiàn)

12.4.2Java線程調(diào)度

12.4.3狀態(tài)轉換

12.5本章小結

第13章線程安全與鎖優(yōu)化

13.1概述

13.2線程安全

13.2.1Java語言中的線程安全

13.2.2線程安全的實現(xiàn)方法

13.3鎖優(yōu)化

13.3.1自旋鎖與自適應自旋

13.3.2鎖消除

13.3.3鎖粗化

13.3.4輕量級鎖

13.3.5偏向鎖

13.4本章小結

附錄

附錄A編譯Windows版的OpenJDK

附錄B虛擬機字節(jié)碼指令表

附錄CHotSpot虛擬機主要參數(shù)表

附錄D對象查詢語言(OQL)簡介

附錄EJDK歷史版本軌跡

在線預覽

及時部分

走近Java

第1章走近Java

第1章走近Java

世界上并沒有的程序,但我們并不因此而沮喪,因為寫程序本來就是一個不斷追求的過程。

1.1概述

Java不僅僅是一門編程語言,還是一個由一系列計算機軟件和規(guī)范形成的技術體系,這個技術體系提供了完整的用于軟件開發(fā)和跨平臺部署的支持環(huán)境,并廣泛應用于嵌入式系統(tǒng)、移動終端、企業(yè)服務器、大型機等各種場合,如圖1-1所示。時至今日,Java技術體系已經(jīng)吸引了900多萬軟件開發(fā)者,這是全球較大的軟件開發(fā)團隊。使用Java的設備多達幾十億臺,其中包括11億多臺個人計算機、30億部移動電話及其他手持設備、數(shù)量眾多的智能卡,以及大量機頂盒、導航系統(tǒng)和其他設備。

Java能獲得如此廣泛的認可,除了它擁有一門結構嚴謹、面向?qū)ο蟮木幊陶Z言之外,還有許多不可忽視的優(yōu)點:它擺脫了硬件平臺的束縛,實現(xiàn)了"一次編寫,到處運行"的理想;它提供了一個相對安全的內(nèi)存管理和訪問機制,避免了絕大部分的內(nèi)存泄露和指針越界問題;它實現(xiàn)了熱點代碼檢測和運行時編譯及優(yōu)化,這使得Java應用能隨著運行時間的增加而獲得更高的性能;它有一套完善的應用程序接口,還有無數(shù)來自商業(yè)機構和開源社區(qū)的第三方類庫來幫助它實現(xiàn)各種各樣的功能……Java所帶來的這些好處使程序的開發(fā)效率得到了很大的提升。作為一名Java程序員,在編寫程序時除了盡情發(fā)揮Java的各種優(yōu)勢外,還應該去了解和思考一下Java技術體系中這些技術特性是如何實現(xiàn)的。認識這些技術運作的本質(zhì),是自己思考"程序這樣寫好不好"的基礎和前提。當我們在使用一種技術時,如果不再依賴書本和他人就能得到這些問題的答案,那才算上升到了"不惑"的境界。

本書將與讀者一起分析Java技術中最重要的那些特性的實現(xiàn)原理。在本章中,我們將重點介紹Java技術體系內(nèi)容以及Java的歷史、現(xiàn)在和未來的發(fā)展趨勢。

1.2Java技術體系

從廣義上講,Clojure、JRuby、Groovy等運行于Java虛擬機上的語言及其相關的程序都屬于Java技術體系中的一員。如果僅從傳統(tǒng)意義上來看,Sun官方所定義的Java技術體系包括以下幾個組成部分:

?Java程序設計語言

?各種硬件平臺上的Java虛擬機

?Class文件格式

?Java API類庫

?來自商業(yè)機構和開源社區(qū)的第三方Java類庫

我們可以把Java程序設計語言、Java虛擬機、Java API類庫這三部分統(tǒng)稱為JDK(Java Development Kit),JDK是用于支持Java程序開發(fā)的最小環(huán)境,在后面的內(nèi)容中,為了講解方便,有一些地方會以JDK來代替整個Java技術體系。另外,可以把Java API類庫中的Java SE API子集和Java虛擬機這兩部分統(tǒng)稱為JRE(Java Runtime Environment),JRE是支持Java程序運行的標準環(huán)境。圖1-2展示了Java技術體系所包含的內(nèi)容,以及JDK和JRE所涵蓋的范圍。

以上是根據(jù)各個組成部分的功能來進行劃分的,如果按照技術所服務的領域來劃分,或者說按照Java技術關注的重點業(yè)務領域來劃分,Java技術體系可以分為4個平臺,分別為:

?Java Card:支持一些Java小程序(Applets)運行在小內(nèi)存設備(如智能卡)上的平臺。

?Java ME(Micro Edition):支持Java程序運行在移動終端(手機、PDA)上的平臺,對Java API有所精簡,并加入了針對移動終端的支持,這個版本以前稱為J2ME。

?Java SE(Standard Edition):支持面向桌面級應用(如Windows下的應用程序)的Java平臺,提供了完整的Java核心API,這個版本以前稱為J2SE。

?Java EE(Enterprise Edition):支持使用多層架構的企業(yè)應用(如ERP、CRM應用)的Java平臺,除了提供Java SE API外,還對其做了大量的擴充并提供了相關的部署支持,這個版本以前稱為J2EE。

1.3Java發(fā)展史

從及時個Java版本誕生到現(xiàn)在已經(jīng)有18年的時間了。滄海桑田一瞬間,轉眼18年過去了,在圖1-3所展示的時間線中,我們看到JDK已經(jīng)發(fā)展到了1.7版。在這18年里還誕生了無數(shù)和Java相關的產(chǎn)品、技術和標準。現(xiàn)在讓我們走入時間隧道,從孕育Java語言的時代開始,再來回顧一下Java的發(fā)展軌跡和歷史變遷。

1991年4月,由James Gosling博士領導的綠色計劃(Green Project)開始啟動,此計劃的目的是開發(fā)一種能夠在各種消費性電子產(chǎn)品(如機頂盒、冰箱、收音機等)上運行的程序架構。這個計劃的產(chǎn)品就是Java語言的前身:Oak(橡樹)。Oak當時在消費品市場上并不算成功,但隨著1995年互聯(lián)網(wǎng)潮流的興起,Oak迅速找到了最適合自己發(fā)展的市場定位并蛻變成為Java語言。

1995年5月23日,Oak語言改名為Java,并且在SunWorld大會上正式Java 1.0版本。Java語言及時次提出了"Write Once,Run Anywhere"的口號。

1996年1月23日,JDK 1.0,Java語言有了及時個正式版本的運行環(huán)境。JDK 1.0提供了一個純解釋執(zhí)行的Java虛擬機實現(xiàn)(Sun Classic VM)。JDK 1.0版本的代表技術包括:Java虛擬機、Applet、AWT等。

1996年4月,10個最主要的操作系統(tǒng)供應商申明將在其產(chǎn)品中嵌入Java技術。同年9月,已有大約8.3萬個網(wǎng)頁應用了Java技術來制作。在1996年5月底,Sun公司于美國舊金山舉行了首屆JavaOne大會,從此JavaOne成為全世界數(shù)百萬Java語言開發(fā)者每年一度的技術盛會。

1997年2月19日,Sun公司了JDK 1.1,Java技術的一些最基礎的支撐點(如JDBC等)都是在JDK 1.1版本中的,JDK 1.1版的技術代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java語法也有了一定的發(fā)展,如內(nèi)部類(Inner Class)和反射(Reflection)都是在這個時候出現(xiàn)的。

直到1999年4月8日,JDK 1.1一共了1.1.0~1.1.8九個版本。從1.1.4之后,每個JDK版本都有一個自己的名字(工程代號),分別為:JDK 1.1.4 - Sparkler(寶石)、JDK 1.1.5 - Pumpkin(南瓜)、JDK 1.1.6 - Abigail(阿比蓋爾,女子名)、JDK 1.1.7 - Brutus(布魯圖,古羅馬政治家和將軍)和JDK 1.1.8 Chelsea(切爾西,城市名)。

1998年12月4日,JDK迎來了一個里程碑式的版本JDK 1.2,工程代號為Playground(競技場),Sun在這個版本中把Java技術體系拆分為3個方向,分別是面向桌面應用開發(fā)的J2SE(Java 2 Platform, Standard Edition)、面向企業(yè)級開發(fā)的J2EE(Java 2 Platform, Enterprise Edition)和面向手機等移動終端開發(fā)的J2ME(Java 2 Platform, Micro Edition)。在這個版本中出現(xiàn)的代表性技術非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且這個版本中Java虛擬機及時次內(nèi)置了JIT(Just In Time)編譯器(JDK 1.2中曾并存過3個虛擬機,Classic VM、HotSpot VM和Exact VM,其中Exact VM只在Solaris平臺出現(xiàn)過;后面兩個虛擬機都是內(nèi)置JIT編譯器的,而之前版本所帶的Classic VM只能以外掛的形式使用JIT編譯器)。在語言和API級別上,Java添加了strictfp關鍵字與現(xiàn)在Java編碼之中極為常用的一系列Collections集合類。在1999年3月和7月,分別有JDK 1.2.1和JDK 1.2.2兩個小版本。

1999年4月27日,HotSpot虛擬機,HotSpot最初由一家名為"Longview Technologies"的小公司開發(fā),因為HotSpot的優(yōu)異表現(xiàn),這家公司在1997年被Sun公司收購了。HotSpot虛擬機時是作為JDK 1.2的附加程序提供的,后來它成為了JDK 1.3及之后所有版本的Sun JDK的默認虛擬機。

2000年5月8日,工程代號為Kestrel(美洲紅隼)的JDK 1.3,JDK 1.3相對于JDK 1.2的改進主要表現(xiàn)在一些類庫上(如數(shù)學運算和新的Timer API等),JNDI服務從JDK 1.3開始被作為一項平臺級服務提供(以前JNDI僅僅是一項擴展),使用CORBA IIOP來實現(xiàn)RMI的通信協(xié)議,等等。這個版本還對Java 2D做了很多改進,提供了大量新的Java 2D API,并且新添加了JavaSound類庫。JDK 1.3有1個修正版本JDK 1.3.1,工程代號為Ladybird(瓢蟲),于2001年5月17日。

自從JDK 1.3開始,Sun維持了一個習慣:大約每隔兩年一個JDK的主版本,以動物命名,期間的各個修正版本則以昆蟲作為工程名稱。

2002年2月13日,JDK 1.4,工程代號為Merlin(灰背隼)。JDK 1.4是Java真正走向成熟的一個版本,Compaq、Fujitsu、SAS、Symbian、IBM等著名公司都有參與甚至實現(xiàn)自己獨立的JDK 1.4。哪怕是在十多年后的今天,仍然有許多主流應用(Spring、Hibernate、Struts等)能直接運行在JDK 1.4之上,或者繼續(xù)能運行在JDK 1.4上的版本。JDK 1.4同樣了很多新的技術特性,如正則表達式、異常鏈、NIO、日志類、XML解析器和XSLT轉換器等。JDK 1.4有兩個后續(xù)修正版:2002年9月16日的工程代號為Grasshopper(蚱蜢)的JDK 1.4.1與2003年6月26日的工程代號為Mantis(螳螂)的JDK 1.4.2。

2002年前后還發(fā)生了一件與Java沒有直接關系,但事實上對Java的發(fā)展進程影響很大的事件,那就是微軟公司的.NET Framework了。這個無論是技術實現(xiàn)上還是目標用戶上都與Java有很多相近之處的技術平臺給Java帶來了很多討論、比較和競爭,.NET平臺和Java平臺之間聲勢浩大的孰優(yōu)孰劣的論戰(zhàn)到目前為止都在繼續(xù)。

2004年9月30日,JDK 1.5,工程代號Tiger(老虎)。從JDK 1.2以來,Java在語法層面上的變換一直很小,而JDK 1.5在Java語法易用性上做出了非常大的改進。例如,自動裝箱、泛型、動態(tài)注解、枚舉、可變長參數(shù)、遍歷循環(huán)(foreach循環(huán))等語法特性都是在JDK 1.5中加入的。在虛擬機和API層面上,這個版本改進了Java的內(nèi)存模型(Java Memory Model,JMM)、提供了java.util.concurrent并發(fā)包等。另外,JDK 1.5是官方聲明可以支持Windows 9x平臺的一個JDK版本。

2006年12月11日,JDK 1.6,工程代號Mustang(野馬)。在這個版本中,Sun終結了從JDK 1.2開始已經(jīng)有8年歷史的J2EE、J2SE、J2ME的命名方式,啟用Java SE 6、Java EE 6、Java ME 6的命名方式。JDK 1.6的改進包括:提供動態(tài)語言支持(通過內(nèi)置Mozilla JavaScript Rhino引擎實現(xiàn))、提供編譯API和微型HTTP服務器API等。同時,這個版本對Java虛擬機內(nèi)部做了大量改進,包括鎖與同步、垃圾收集、類加載等方面的算法都有相當多的改動。

在2006年11月13日的JavaOne大會上,Sun公司宣布最終會將Java開源,并在隨后的一年多時間內(nèi),陸續(xù)將JDK的各個部分在GPL v2(GNU General Public License v2)協(xié)議下公開了源碼,并建立了OpenJDK組織對這些源碼進行獨立管理。除了極少量的產(chǎn)權代碼(Encumbered Code,這部分代碼大多是Sun本身也無權限進行開源處理的)外,OpenJDK幾乎包括了Sun JDK的全部代碼,OpenJDK的質(zhì)量主管曾經(jīng)表示,在JDK 1.7中,Sun JDK和OpenJDK除了代碼文件頭的版權注釋之外,代碼基本上一樣,所以OpenJDK 7與Sun JDK 1.7本質(zhì)上就是同一套代碼庫開發(fā)的產(chǎn)品。

JDK 1.6以后,由于代碼復雜性的增加、JDK開源、開發(fā)JavaFX、經(jīng)濟危機及Sun收購案等原因,Sun在JDK發(fā)展以外的事情上耗費了很多資源,JDK的更新沒有再維持兩年一個主版本的發(fā)展速度。JDK 1.6到目前為止一共了37個Update版本,近期的版本為Java SE 6 Update 37,于2012年10月16日。

2009年2月19日,工程代號為Dolphin(海豚)的JDK 1.7完成了其及時個里程碑版本。根據(jù)JDK 1.7的功能規(guī)劃,一共設置了10個里程碑。一個里程碑版本原計劃于2010年9月9日結束,但由于各種原因,JDK 1.7最終無法按計劃完成。

從JDK 1.7最開始的功能規(guī)劃來看,它本應是一個包含許多重要改進的JDK版本,其中的Lambda項目(Lambda表達式、函數(shù)式編程)、Jigsaw項目(虛擬機模塊化支持)、動態(tài)語言支持、GarbageFirst收集器和Coin項目(語言細節(jié)進化)等子項目對于Java業(yè)界都會產(chǎn)生深遠的影響。在JDK 1.7開發(fā)期間,Sun公司由于相繼在技術競爭和商業(yè)競爭中都陷入泥潭,公司的股票市值跌至僅有高峰時期的3%,已無力推動JDK 1.7的研發(fā)工作按正常計劃進行。為了盡快結束JDK 1.7長期"跳票"的問題,Oracle公司收購Sun公司后不久便宣布將實行"B計劃",大幅裁剪了JDK 1.7預定目標,以便保障JDK 1.7的正式版能夠于2011年7月28日準時。"B計劃"把不能按時完成的Lambda項目、Jigsaw項目和Coin項目的部分改進延遲到JDK 1.8之中。最終,JDK 1.7的主要改進包括:提供新的G1收集器(G1在時依然處于Experimental狀態(tài),直至2012年4月的Update 4中才正式"轉正")、加強對非Java語言的調(diào)用支持(JSR-292,這項特性到目前為止依然沒有實現(xiàn)定型)、升級類加載架構等。

到目前為止,JDK 1.7已經(jīng)了9個Update版本,近期的Java SE 7 Update 9于2012年10月16日。從Java SE 7 Update 4起,Oracle開始支持Mac OS X操作系統(tǒng),并在Update 6中達到支持的程度,同時,在Update 6中還對ARM指令集架構提供了支持。至此,官方提供的JDK可以運行于Windows(不含Windows 9x)、Linux、Solaris和Mac OS平臺上,支持ARM、x86、x64和Sparc指令集架構類型。

2009年4月20日,Oracle公司宣布正式以74億美元的價格收購Sun公司,Java商標從此正式歸Oracle所有(Java語言本身并不屬于哪間公司所有,它由JCP組織進行管理,盡管JCP主要是由Sun公司或者說Oracle公司所領導的)。由于此前Oracle公司已經(jīng)收購了另外一家大型的中間件企業(yè)BEA公司,在完成對Sun公司的收購之后,Oracle公司分別從BEA和Sun中取得了目前三大商業(yè)虛擬機的其中兩個:JRockit和HotSpot,Oracle公司宣布在未來1~2年的時間內(nèi),將把這兩個的虛擬機互相取長補短,最終合二為一。可以預見在不久的將來,Java虛擬機技術將會產(chǎn)生相當巨大的變化。

根據(jù)Oracle官方提供的信息,JDK 1.8的及時個正式版本將于2013年9月,JDK 1.8將會提供在JDK 1.7中規(guī)劃過,但最終未能在JDK 1.7中的特性,即Lambda表達式、Jigsaw(很不幸,隨后Oracle公司又宣布Jigsaw在JDK 1.8中依然無法完成,需要延至JDK 1.9)和JDK 1.7中未實現(xiàn)的一部分Coin等。

在2011年的JavaOne大會上,Oracle公司還提到了JDK 1.9的長遠規(guī)劃,希望未來的Java虛擬機能夠管理數(shù)以GB計的Java堆,能夠更高效地與本地代碼集成,并且令Java虛擬機運行時盡可能少人工干預,能夠自動調(diào)節(jié)。

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

上一節(jié)我們從整個Java技術的角度觀察了Java技術的發(fā)展,許多Java程序員都會潛意識地把它與Sun公司的HotSpot虛擬機等同看待,也許還有一些程序員會注意到BEA JRockit和IBM J9,但對JVM的認識不僅僅只有這些。

從1996年初Sun公司的JDK 1.0中所包含的Sun Classic VM到今天,曾經(jīng)涌現(xiàn)、湮滅過許多或經(jīng)典或或有特色的虛擬機實現(xiàn),在這一節(jié)中,我們先暫且把代碼與技術放下,一起來回顧一下Java虛擬機家族的發(fā)展軌跡和歷史變遷。

1.4.1Sun Classic / Exact VM

以今天的視角來看,Sun Classic VM的技術可能很原始,這款虛擬機的使命也早已終結。但僅憑它"世界上及時款商用Java虛擬機"的頭銜,就足夠有讓歷史記住它的理由。

1996年1月23日,Sun公司JDK 1.0,Java語言首次擁有了商用的正式運行環(huán)境,這個JDK中所帶的虛擬機就是Classic VM。這款虛擬機只能使用純解釋器方式來執(zhí)行Java代碼,如果要使用JIT編譯器,就必須進行外掛。但是假如外掛了JIT編譯器,JIT編譯器就接管了虛擬機的執(zhí)行系統(tǒng),解釋器便不再工作了。用戶在這款虛擬機上執(zhí)行java -version命令,將會看到類似下面這行輸出:

java version "1.2.2"

Classic VM (build JDK-1.2.2-001, green threads, sunwjit)

其中的"sunwjit"就是Sun提供的外掛編譯器,其他類似的外掛編譯器還有Symantec JIT和shuJIT等。由于解釋器和編譯器不能配合工作,這就意味著如果要使用編譯器執(zhí)行,編譯器就不得不對每一個方法、每一行代碼都進行編譯,而無論它們執(zhí)行的頻率是否具有編譯的價值。基于程序響應時間的壓力,這些編譯器根本不敢應用編譯耗時稍高的優(yōu)化技術,因此這個階段的虛擬機即使用了JIT編譯器輸出本地代碼,執(zhí)行效率也和傳統(tǒng)的C/C++程序有很大差距,"Java語言很慢"的形象就是在這時候開始在用戶心中樹立起來的

網(wǎng)友評論(不代表本站觀點)

來自無昵稱**的評論:

這本書是一本好書一口氣就看完了,但是!如果我不是看到這個是當當自營而且紙張質(zhì)量這么好,我真的覺得這是盜版,書中明顯有樣例代碼缺失,代碼行數(shù)都印丟了,而且代碼有的是短短續(xù)續(xù)的,關鍵的幾行,作者詳細講的幾行都不見了?我覺得這肯定不是出版社的鍋,既然作者在講肯定會印,至于原因我不想追問,就書而言是很好的一本書,就購物來講,差。

2017-11-22 15:02:48
來自超級ido**的評論:

近日一直在閱讀這本書,書寫的很棒,解開我很多開發(fā)過程中遇到的疑惑。 后來閑來無事 翻閱effective java這本書,竟然從中又感悟到很多,著實讓我驚訝,非常推薦閱讀

2016-04-27 10:23:44
來自askcuix**的評論:

難得的Java虛擬機方面的好書,通俗易懂,平時對這塊知識了解很薄弱的都能理解清楚了,但是又不會講的很初級,是每個Java開發(fā)人員的必備秘籍,希望國人能夠多出一些這樣的好書!

2017-11-08 17:45:38
來自無昵稱**的評論:

深入理解java虛擬機,學java的必看。好書!!

2015-08-14 09:13:05
來自2005227**的評論:

不僅僅是javaer,其他想對虛擬機深入了解的,應該認真分析此書,當今最成熟的虛擬機實現(xiàn)之一

2013-12-28 13:35:47
來自無昵稱**的評論:

講的java7不算新,不過講解非常清晰,很受用!一本好書,好書一本!

2017-10-13 20:47:01
來自無昵稱**的評論:

紙質(zhì)挺好的,學習虛擬機挺好的書。看了電子版的,回來買紙版的。

2016-04-09 23:56:05
來自無昵稱**的評論:

主要圍繞hotspot虛擬機展開內(nèi)容,講的比較全面,難度不是很大,設置了一些實戰(zhàn)環(huán)節(jié)相當不錯,在國人寫的書中算是相當難得了

2015-04-17 14:06:06
來自joe926**的評論:

國內(nèi)很少Java虛擬機方面的介紹, 這本書讓我了解了很多虛擬機的細節(jié)。

2013-08-11 16:58:02
來自無昵稱**的評論:

第一版的時候就看過,比較經(jīng)典的一本書。介紹了java的內(nèi)存模型,**收集算法,**收集器,jdk自帶的常用工具的等,介紹的比較系統(tǒng)、詳細。

2015-09-05 10:46:05
來自漢德塞**的評論:

JAVA虛擬機原理講的非常好的書,經(jīng)典之作,沒的說。

2015-10-30 19:09:27
來自無昵稱**的評論:

看后對虛擬機有了進一步的理解,對自我優(yōu)化這塊還是很有借鑒價值的,甚至在編碼層次也會有更多的幫助!

2015-11-11 11:15:54
來自無昵稱**的評論:

要學習java虛擬機的,可以研讀下,最好結合jdk源碼一起看

2016-08-25 10:27:21
來自keeps9**的評論:

之前在JD買了三本技術書,感覺紙張薄,像是影印的,不像正版,這次選擇在當當,拿到書翻開看,是書紙那種淡淡的黃色,同時很有質(zhì)感,每一張紙顯得很厚實,以后打算都優(yōu)先在當當買。這次也是我很久以來寫的一次評論,以前都是直接手機上確認收貨就完了,這一次是真心想來評論的,說不清為什么,但就是由心而發(fā)的想

2016-06-20 21:53:51
來自無昵稱**的評論:

書非常好,很佩服作者對jvm的全面了解。內(nèi)容講的很深,需要有一定的開發(fā)經(jīng)驗以及對計算機底層的了解才能很好的適應這本書,我看到后面半本書也是有些看不懂了。

2016-04-24 15:16:23
來自stevech**的評論:

很好的一本書,把整個Java虛擬機講了一遍,做Java開發(fā)值得擁有,買過的計算機書這本最好

2015-05-03 23:50:14
來自若虛小**的評論:

Java虛擬機,Java學習進階嘞書籍,暫時看不懂,先學好基礎

2017-08-22 11:06:03
來自阿久與**的評論:

對JAVA內(nèi)存溢出做了很詳細的分析,正好能解決我現(xiàn)在的問題

2017-09-07 08:41:53
來自匿名用**的評論:

Java程序員必讀經(jīng)典,深入理解Java虛擬機,也是各種大牛推薦過的,趁著這次活動,果斷出手,很喜歡

2017-05-03 17:15:35
來自無昵稱**的評論:

買了讀了第二章,加深了對虛擬機的了解,看起來比較流暢。

2017-10-17 23:36:17
來自rorosu**的評論:

書是好書,印刷什么的都不錯,沒有去某寶買那18塊錢的西貝貨,特地來買正品,確實有這方面的保障,但是……書的右下角一大塊被壓出嚴重折痕變形,作為想買完美正品的人估計肯定會覺得有些不爽

2016-01-22 22:33:55
來自無昵稱**的評論:

一下子從當當買了三本書,這本書和并發(fā)編程,還有《Effective in java》,正在深讀jvm,對理解虛擬機底層真的很有幫助,我會認真讀完

2017-09-22 20:49:34
來自無昵稱**的評論:

這書是國內(nèi)少有的描述JVM虛擬機原理的書籍,最大的特點是采用作者一貫的嚴謹而生動的語言,清楚地向讀者描述虛擬機的機制、特性、原理以及實踐,非常值得一看,比較推薦!

2014-05-04 11:40:51
來自楊柳白**的評論:

Java虛擬機學習不錯的參考書,透徹深入,推薦!

2017-08-17 12:07:38
來自悟空190**的評論:

Java程序員必讀經(jīng)典,深入理解Java虛擬機,也是各種大牛推薦過的,趁著這次活動,果斷出手,很喜歡。

2016-04-25 13:24:05
來自以***(**的評論:

自認為是看過的有關虛擬機最好的一本書,解決了諸多一直以來困擾我的困惑,比如java對象在內(nèi)存里的布局,訪問方式等等,不錯

2017-04-25 13:40:16
來自無昵稱**的評論:

我大學的時候曾經(jīng)讀過此書的第一版,對于書中講解的JVM的只是非常癡迷,只可惜大學畢業(yè)書仍在北京了,最進發(fā)現(xiàn)此書出了第二版就立即買下來了,推薦所有和我一樣想成為Java架構師的同行,一定要入手一本。

2013-06-14 09:37:09
來自無昵稱**的評論:

昨天早上9點開始派送的,然后下午打電話說今天送不了,沒人送放假了。周一送,然后我今天中午打開軟件一看,顯示已經(jīng)簽收,問題是我一個電話也沒有收到,我都不知道簽收到哪去了,本來是一次愉快的購物!!!!!!!!!!!!

2016-11-21 13:07:50
來自無昵稱**的評論:

內(nèi)容很不錯,是國內(nèi)少有的講解Java虛擬機的書籍,值得開發(fā)者一看。

2015-06-19 16:27:07
來自守之以**的評論:

確為提升Java功力之良藥,本書使自己對于虛擬機的運行機理與底層知識真正來了一次近距離接觸,許多知識不再只是符號或文字的堆疊,而是一種真正地理解。不過深度上有些地方的確不如10年前出版的那本書,算是一點遺憾吧。

2017-06-29 08:35:43

免責聲明

更多出版社