出版時(shí)間:2011-6 出版社:機(jī)械工業(yè)出版社 作者:周志明 頁(yè)數(shù):387
Tag標(biāo)簽:無(wú)
前言
Java是目前用戶(hù)最多、使用范圍最廣的軟件開(kāi)發(fā)技術(shù),Java的技術(shù)體系主要由支撐Java程序運(yùn)行的虛擬機(jī)、為各開(kāi)發(fā)領(lǐng)域提供接口支持的Java API、Java編程語(yǔ)言及許許多多的第三方Java框架(如Spring和Struts等)構(gòu)成。在國(guó)內(nèi),有關(guān)Java API、Java語(yǔ)言及第三方框架的技術(shù)資料和書(shū)籍非常豐富,相比之下,有關(guān)Java虛擬機(jī)的資料卻顯得異常貧乏。 這種狀況很大程度上是由Java開(kāi)發(fā)技術(shù)本身的一個(gè)重要優(yōu)點(diǎn)導(dǎo)致的:在虛擬機(jī)層面隱藏了底層技術(shù)的復(fù)雜性以及機(jī)器與操作系統(tǒng)的差異性。運(yùn)行程序的物理機(jī)器情況千差萬(wàn)別,而Java虛擬機(jī)則在千差萬(wàn)別的物理機(jī)上面建立了統(tǒng)一的運(yùn)行平臺(tái),實(shí)現(xiàn)了在任意一臺(tái)虛擬機(jī)上編譯的程序都能在任何一臺(tái)虛擬機(jī)上正常運(yùn)行。這一極大的優(yōu)勢(shì)使得Java應(yīng)用的開(kāi)發(fā)比傳統(tǒng)C/C++應(yīng)用的開(kāi)發(fā)更高效和快捷,程序員可以把主要精力集中在具體業(yè)務(wù)邏輯上,而不是物理硬件的兼容性上。一般情況下,一個(gè)程序員只要了解了必要的Java API、Java語(yǔ)法并學(xué)習(xí)適當(dāng)?shù)牡谌介_(kāi)發(fā)框架,就已經(jīng)基本能滿足日常開(kāi)發(fā)的需要了,虛擬機(jī)會(huì)在用戶(hù)不知不覺(jué)中完成對(duì)硬件平臺(tái)的兼容以及對(duì)內(nèi)存等資源的管理工作。因此,了解虛擬機(jī)的運(yùn)作并不是一般開(kāi)發(fā)人員必須掌握的知識(shí)?! ∪欢?,凡事都具備兩面性。隨著Java技術(shù)的不斷發(fā)展,它被應(yīng)用于越來(lái)越多的領(lǐng)域之中。其中一些領(lǐng)域,如電力、金融、通信等,對(duì)程序的性能、穩(wěn)定性和可擴(kuò)展性方面都有極高的要求。一個(gè)程序很可能在10個(gè)人同時(shí)使用時(shí)完全正常,但是在10000個(gè)人同時(shí)使用時(shí)就會(huì)變慢、死鎖甚至崩潰。毫無(wú)疑問(wèn),要滿足10000個(gè)人同時(shí)使用需要更高性能的物理硬件,但是在絕大多數(shù)情況下,提升硬件效能無(wú)法等比例地提升程序的性能和并發(fā)能力,有時(shí)甚至可能對(duì)程序的性能沒(méi)有任何改善作用。這里面有Java虛擬機(jī)的原因:為了達(dá)到為所有硬件提供一致的虛擬平臺(tái)的目的,犧牲了一些硬件相關(guān)的性能特性。更重要的是人為原因:開(kāi)發(fā)人員如果不了解虛擬機(jī)的一些技術(shù)特性的運(yùn)行原理,就無(wú)法寫(xiě)出最適合虛擬機(jī)運(yùn)行和可自?xún)?yōu)化的代碼?! ∑鋵?shí),目前商用的高性能Java虛擬機(jī)都提供了相當(dāng)多的優(yōu)化特性和調(diào)節(jié)手段,用于滿足應(yīng)用程序在實(shí)際生產(chǎn)環(huán)境中對(duì)性能和穩(wěn)定性的要求。如果只是為了入門(mén)學(xué)習(xí),讓程序在自己的機(jī)器上正常運(yùn)行,那么這些特性可以說(shuō)是可有可無(wú)的;如果用于生產(chǎn)環(huán)境,尤其是企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,就迫切需要開(kāi)發(fā)人員中至少有一部分人對(duì)虛擬機(jī)的特性及調(diào)節(jié)方法具有很清晰的認(rèn)識(shí),所以在Java開(kāi)發(fā)體系中,對(duì)架構(gòu)師、系統(tǒng)調(diào)優(yōu)師、高級(jí)程序員等角色的需求一直都非常大。學(xué)習(xí)虛擬機(jī)中各種自動(dòng)運(yùn)作的特性的原理也成為了Java程序員成長(zhǎng)道路上必然會(huì)接觸到的一課。通過(guò)本書(shū),讀者可以以一種相對(duì)輕松的方式學(xué)習(xí)虛擬機(jī)的運(yùn)作原理,對(duì)Java程序員的成長(zhǎng)也有較大的幫助。
內(nèi)容概要
作為一位Java程序員,你是否也曾經(jīng)想深入理解Java虛擬機(jī),但是卻被它的復(fù)雜和深?yuàn)W拒之門(mén)外?沒(méi)關(guān)系,本書(shū)極盡化繁為簡(jiǎn)之妙,能帶領(lǐng)你在輕松中領(lǐng)略Java虛擬機(jī)的奧秘。本書(shū)是近年來(lái)國(guó)內(nèi)出版的唯一一本與Java虛擬機(jī)相關(guān)的專(zhuān)著,也是唯一一本同時(shí)從核心理論和實(shí)際運(yùn)用這兩個(gè)角度去探討Java虛擬機(jī)的著作,不僅理論分析得透徹,而且書(shū)中包含的典型案例和最佳實(shí)踐也極具現(xiàn)實(shí)指導(dǎo)意義。
全書(shū)共分為五大部分。第一部分從宏觀的角度介紹了整個(gè)Java技術(shù)體系的過(guò)去、現(xiàn)在和未來(lái),以及如何獨(dú)立地編譯一個(gè)OpenJDK7,這對(duì)理解后面的內(nèi)容很有幫助。第二部分講解了JVM的自動(dòng)內(nèi)存管理,包括虛擬機(jī)內(nèi)存區(qū)域的劃分原理以及各種內(nèi)存溢出異常產(chǎn)生的原因;常見(jiàn)的垃圾收集算法以及垃圾收集器的特點(diǎn)和工作原理;常見(jiàn)的虛擬機(jī)的監(jiān)控與調(diào)試工具的原理和使用方法。第三部分分析了虛擬機(jī)的執(zhí)行子系統(tǒng),包括Class的文件結(jié)構(gòu)以及如何存儲(chǔ)和訪問(wèn)Class中的數(shù)據(jù);虛擬機(jī)的類(lèi)創(chuàng)建機(jī)制以及類(lèi)加載器的工作原理和它對(duì)虛擬機(jī)的意義;虛擬機(jī)字節(jié)碼的執(zhí)行引擎以及它在實(shí)行代碼時(shí)涉及的內(nèi)存結(jié)構(gòu)。第四部分講解了程序的編譯與代碼的優(yōu)化,闡述了泛型、自動(dòng)裝箱拆箱、條件編譯等語(yǔ)法糖的原理;講解了虛擬機(jī)的熱點(diǎn)探測(cè)方法、HotSpot的即時(shí)編譯器、編譯觸發(fā)條件,以及如何從虛擬機(jī)外部觀察和分析JIT編譯的數(shù)據(jù)和結(jié)果。第五部分探討了Java實(shí)現(xiàn)高效并發(fā)的原理,包括JVM內(nèi)存模型的結(jié)構(gòu)和操作;原子性、可見(jiàn)性和有序性在Java內(nèi)存模型中的體現(xiàn);先行發(fā)生原則的規(guī)則和使用;線程在Java語(yǔ)言中的實(shí)現(xiàn)原理;虛擬機(jī)實(shí)現(xiàn)高效并發(fā)所做的一系列鎖優(yōu)化措施。
本書(shū)適合所有Java程序員、系統(tǒng)調(diào)優(yōu)師和系統(tǒng)架構(gòu)師閱讀。
作者簡(jiǎn)介
周志明,資深Java技術(shù)專(zhuān)家,對(duì)JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)、OSGi、Java虛擬機(jī)和工作流等都有深入的研究,并在大量的實(shí)踐中積累了豐富的經(jīng)驗(yàn)。尤其精通Java虛擬機(jī),撰寫(xiě)了大量與JVM相關(guān)的經(jīng)典文章,被各大技術(shù)社區(qū)爭(zhēng)相轉(zhuǎn)載,是ITeye等技術(shù)社區(qū)公認(rèn)的Java虛擬機(jī)方面的領(lǐng)袖人物之一。現(xiàn)任遠(yuǎn)光軟件股份有限公司平臺(tái)開(kāi)發(fā)部經(jīng)理兼平臺(tái)架構(gòu)師,先后參加與過(guò)國(guó)家電網(wǎng)、南方電網(wǎng)等多個(gè)國(guó)家級(jí)大型ERP項(xiàng)目的平臺(tái)架構(gòu)工作,對(duì)軟件系統(tǒng)架構(gòu)也有深刻的認(rèn)識(shí)和體會(huì)。
書(shū)籍目錄
前言
致謝
第一部分 走近Java
第1章 走近Java
1.1 概述
1.2 Java技術(shù)體系
1.3 Java發(fā)展史
1.4 展望Java技術(shù)的未來(lái)
1.4.1 模塊化
1.4.2 混合語(yǔ)言
1.4.3 多核并行
1.4.4 進(jìn)一步豐富語(yǔ)法
1.4.5 64位虛擬機(jī)
1.5 實(shí)戰(zhàn):自己編譯JDK
1.5.1 獲取JDK源碼
1.5.2 系統(tǒng)需求
1.5.3 構(gòu)建編譯環(huán)境
1.5.4 準(zhǔn)備依賴(lài)項(xiàng)
1.5.5 進(jìn)行編譯
1.6 本章小結(jié)
第二部分 自動(dòng)內(nèi)存管理機(jī)制
第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常
2.1 概述
2.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)域
2.2.1 程序計(jì)數(shù)器
2.2.2 Java虛擬機(jī)棧
2.2.3 本地方法棧
2.2.4 Java堆
2.2.5 方法區(qū)
2.2.6 運(yùn)行時(shí)常量池
2.2.7 直接內(nèi)存
2.3 對(duì)象訪問(wèn)
2.4 實(shí)戰(zhàn):OutOfMemoryError異常
2.4.1 Java堆溢出
2.4.2 虛擬機(jī)棧和本地方法棧溢出
2.4.3 運(yùn)行時(shí)常量池溢出
2.4.4 方法區(qū)溢出
2.4.5 本機(jī)直接內(nèi)存溢出
2.5 本章小結(jié)
第3章 垃圾收集器與內(nèi)存分配策略
3.1 概述
3.2 對(duì)象已死?
3.2.1 引用計(jì)數(shù)算法
3.2.2 根搜索算法
3.2.3 再談引用
3.2.4 生存還是死亡?
3.2.5 回收方法區(qū)
3.3 垃圾收集算法
3.3.1 標(biāo)記 -清除算法
3.3.2 復(fù)制算法
3.3.3 標(biāo)記-整理算法
3.3.4 分代收集算法
3.4 垃圾收集器
3.4.1 Serial收集器
3.4.2 ParNew收集器
3.4.3 Parallel Scavenge收集器
3.4.4 Serial Old收集器
3.4.5 Parallel Old收集器
3.4.6 CMS收集器
3.4.7 G1收集器
3.4.8 垃圾收集器參數(shù)總結(jié)
3.5 內(nèi)存分配與回收策略
3.5.1 對(duì)象優(yōu)先在Eden分配
3.5.2 大對(duì)象直接進(jìn)入老年代
3.5.3 長(zhǎng)期存活的對(duì)象將進(jìn)入老年代
3.5.4 動(dòng)態(tài)對(duì)象年齡判定
3.5.5 空間分配擔(dān)保
3.6 本章小結(jié)
第4章 虛擬機(jī)性能監(jiān)控與故障處理工具
4.1 概述
4.2 JDK的命令行工具
4.2.1 jps:虛擬機(jī)進(jìn)程狀況工具
4.2.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
4.2.3 jinfo:Java配置信息工具
4.2.4 jmap:Java內(nèi)存映像工具
4.2.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
4.2.6 jstack:Java堆棧跟蹤工具
4.3 JDK的可視化工具
4.3.1 JConsole:Java監(jiān)視與管理控制臺(tái)
4.3.2 VisualVM:多合一故障處理工具
4.4 本章小結(jié)
第5章 調(diào)優(yōu)案例分析與實(shí)戰(zhàn)
5.1 概述
5.2 案例分析
5.2.1 高性能硬件上的程序部署策略
5.2.2 集群間同步導(dǎo)致的內(nèi)存溢出
5.2.3 堆外內(nèi)存導(dǎo)致的溢出錯(cuò)誤
5.2.4 外部命令導(dǎo)致系統(tǒng)緩慢
5.2.5 服務(wù)器JVM進(jìn)程崩潰
5.3 實(shí)戰(zhàn):Eclipse運(yùn)行速度調(diào)優(yōu)
5.3.1 調(diào)優(yōu)前的程序運(yùn)行狀態(tài)
5.3.2 升級(jí)JDK 1.6的性能變化及兼容問(wèn)題
5.3.3 編譯時(shí)間和類(lèi)加載時(shí)間的優(yōu)化
5.3.4 調(diào)整內(nèi)存設(shè)置控制垃圾收集頻率
5.3.5 選擇收集器降低延遲
5.4 本章小結(jié)
第三部分 虛擬機(jī)執(zhí)行子系統(tǒng)
第6章 類(lèi)文件結(jié)構(gòu)
6.1 概述
6.2 無(wú)關(guān)性的基石
6.3 Class類(lèi)文件的結(jié)構(gòu)
6.3.1 魔數(shù)與Class文件的版本
6.3.2 常量池
6.3.3 訪問(wèn)標(biāo)志
6.3.4 類(lèi)索引、父類(lèi)索引與接口索引集合
6.3.5 字段表集合
6.3.6 方法表集合
6.3.7 屬性表集合
6.4 Class文件結(jié)構(gòu)的發(fā)展
6.5 本章小結(jié)
第7章 虛擬機(jī)類(lèi)加載機(jī)制
7.1 概述
7.2 類(lèi)加載的時(shí)機(jī)
7.3 類(lèi)加載的過(guò)程
7.3.1 加載
7.3.2 驗(yàn)證
7.3.3 準(zhǔn)備
7.3.4 解析
7.3.5 初始化
7.4 類(lèi)加載器
7.4.1 類(lèi)與類(lèi)加載器
7.4.2 雙親委派模型
7.4.3 破壞雙親委派模型
7.5 本章小結(jié)
第8章 虛擬機(jī)字節(jié)碼執(zhí)行引擎
8.1 概述
8.2 運(yùn)行時(shí)棧幀結(jié)構(gòu)
8.2.1 局部變量表
8.2.2 操作數(shù)棧
8.2.3 動(dòng)態(tài)連接
8.2.4 方法返回地址
8.2.5 附加信息
8.3 方法調(diào)用
8.3.1 解析
8.3.2 分派
8.4 基于棧的字節(jié)碼解釋執(zhí)行引擎
8.4.1 解釋執(zhí)行
8.4.2 基于棧的指令集與基于寄存器的指令集
8.4.3 基于棧的解釋器執(zhí)行過(guò)程
8.5 本章小結(jié)
第9章 類(lèi)加載及執(zhí)行子系統(tǒng)的案例與實(shí)戰(zhàn)
9.1 概述
9.2 案例分析
9.2.1 Tomcat:正統(tǒng)的類(lèi)加載器架構(gòu)
9.2.2 OSGi:靈活的類(lèi)加載器架構(gòu)
9.2.3 字節(jié)碼生成技術(shù)與動(dòng)態(tài)代理的實(shí)現(xiàn)
9.2.4 Retrotranslator:跨越JDK版本
9.3 實(shí)戰(zhàn):自己動(dòng)手實(shí)現(xiàn)遠(yuǎn)程執(zhí)行功能
9.3.1 目標(biāo)
9.3.2 思路
9.3.3 實(shí)現(xiàn)
9.3.4 驗(yàn)證
9.4 本章小結(jié)
第四部分 程序編譯與代碼優(yōu)化
第10章 早期(編譯期)優(yōu)化
10.1 概述
10.2 Javac編譯器
10.2.1 Javac的源碼與調(diào)試
10.2.2 解析與填充符號(hào)表
10.2.3 注解處理器
10.2.4 語(yǔ)義分析與字節(jié)碼生成
10.3 Java語(yǔ)法糖的味道
10.3.1 泛型與類(lèi)型擦除
10.3.2 自動(dòng)裝箱、拆箱與遍歷循環(huán)
10.3.3 條件編譯
10.4 實(shí)戰(zhàn):插入式注解處理器
10.4.1 實(shí)戰(zhàn)目標(biāo)
10.4.2 代碼實(shí)現(xiàn)
10.4.3 運(yùn)行與測(cè)試
10.4.4 其他應(yīng)用案例
10.5 本章小結(jié)
第11章 晚期(運(yùn)行期)優(yōu)化
11.1 概述
11.2 HotSpot虛擬機(jī)內(nèi)的即時(shí)編譯器
11.2.1 解釋器與編譯器
11.2.2 編譯對(duì)象與觸發(fā)條件
11.2.3 編譯過(guò)程
11.2.4 查看與分析即時(shí)編譯結(jié)果
11.3 編譯優(yōu)化技術(shù)
11.3.1 優(yōu)化技術(shù)概覽
11.3.2 公共子表達(dá)式消除
11.3.3 數(shù)組邊界檢查消除
11.3.4 方法內(nèi)聯(lián)
11.3.5 逃逸分析
11.4 Java與C/C++的編譯器對(duì)比
11.5 本章小結(jié)
第五部分 高效并發(fā)
第12章 Java內(nèi)存模型與線程
12.1 概述
12.2 硬件的效率與一致性
12.3 Java內(nèi)存模型
12.3.1 主內(nèi)存與工作內(nèi)存
12.3.2 內(nèi)存間交互操作
12.3.3 對(duì)于volatile型變量的特殊規(guī)則
12.3.4 對(duì)于long和double型變量的特殊規(guī)則
12.3.5 原子性、可見(jiàn)性與有序性
12.3.6 先行發(fā)生原則
12.4 Java與線程
12.4.1 線程的實(shí)現(xiàn)
12.4.2 Java線程調(diào)度
12.4.3 狀態(tài)轉(zhuǎn)換
12.5 本章小結(jié)
第13章 線程安全與鎖優(yōu)化
13.1 概述
13.2 線程安全
13.2.1 Java語(yǔ)言中的線程安全
13.2.2 線程安全的實(shí)現(xiàn)方法
13.3 鎖優(yōu)化
13.3.1 自旋鎖與自適應(yīng)自旋
13.3.2 鎖消除
13.3.3 鎖粗化
13.3.4 輕量級(jí)鎖
13.3.5 偏向鎖
13.4 本章小結(jié)
附錄A Java虛擬機(jī)家族
附錄B 虛擬機(jī)字節(jié)碼指令表
附錄C HotSpot虛擬機(jī)主要參數(shù)表
附錄D 對(duì)象查詢(xún)語(yǔ)言(OQL)簡(jiǎn)介
附錄E JDK歷史版本軌跡
媒體關(guān)注與評(píng)論
Java 程序是如何運(yùn)行的?Java虛擬機(jī)在其中扮演了怎樣的角色?如何讓Java程序具有更高的并發(fā)性?許多Java程序員都會(huì)諸如此類(lèi)的疑問(wèn)。無(wú)奈,國(guó)內(nèi)在很長(zhǎng)一段時(shí)間里都沒(méi)有一本從實(shí)際應(yīng)用的角度講解Java虛擬機(jī)的著作,《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》的出版可謂填補(bǔ)了這個(gè)空白。它從Java程序員的角度出發(fā),系統(tǒng)地將Java程序運(yùn)行過(guò)程中涉及的各種知識(shí)整合到了一起,并配以日常工作中可能會(huì)碰到的疑難案例,引領(lǐng)讀者輕松踏上探索Java虛擬機(jī)的旅途,是廣大對(duì)Java虛擬機(jī)感興趣的讀者的福音! ——莫樞(RednaxelaFX) 虛擬機(jī)和編程語(yǔ)言愛(ài)好者 在武俠的世界里,無(wú)論是至剛至強(qiáng)的《易筋經(jīng)》,還是陰柔無(wú)比的《葵花寶典》,都離不開(kāi)內(nèi)功修煉。沒(méi)有了內(nèi)功心法,這些武術(shù)只是花拳繡腿的拙劣表演而已。軟件業(yè)是武林江湖的一個(gè)翻版,也有著大量的模式、套路、規(guī)范等外功,但“外功修行,內(nèi)功修神”,要想成為“掃地僧”一樣的絕世高人,此書(shū)是必備的?! ?mdash;—秦小波 資深Java技術(shù)專(zhuān)家/著有暢銷(xiāo)書(shū)《設(shè)計(jì)模式之禪》 對(duì)Java程序員來(lái)說(shuō),Java虛擬機(jī)可以說(shuō)是既熟悉又神秘,很少Java程序員能夠抑制自己探究它的沖動(dòng)??上?,分析JVM實(shí)現(xiàn)原理的書(shū)籍(特別是國(guó)內(nèi)作者出版的)是少之又少?!渡钊肜斫釰ava虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》的出版可謂Java程序員的福音,作者將自己多年來(lái)在Java虛擬機(jī)領(lǐng)域的實(shí)踐經(jīng)驗(yàn)和研究心得呈現(xiàn)在了這《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》中,不僅系統(tǒng)地講解了Java虛擬機(jī)工作機(jī)制和底層原理,而且更難能可貴的是與實(shí)踐很好地結(jié)合了起來(lái),具有非常強(qiáng)的實(shí)踐指導(dǎo)意義,強(qiáng)烈推薦! ——計(jì)文柯 資深Java技術(shù)專(zhuān)家/著有暢銷(xiāo)書(shū)《Spring技術(shù)內(nèi)幕:深入解析Spring架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理》
編輯推薦
圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、編程編譯與優(yōu)化、高效并發(fā)等核心內(nèi)容對(duì)JVM進(jìn)行全面而深入的分析,深刻揭示JVM的工作原理;注重實(shí)現(xiàn),以解決實(shí)踐中的疑難問(wèn)題為首要目的,包含大量經(jīng)典案例和最佳實(shí)踐。
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版