《深入分析Java Web技術(shù)內(nèi)幕(修訂版)》新增了淘 寶在無(wú)線端的應(yīng)用實(shí)踐,包括:CDN 動(dòng)態(tài)加速、多終端化改造、 多終端Session 統(tǒng)一 ,以及在大流量的情況下,如何跨越性能、網(wǎng)絡(luò)和一個(gè)地區(qū)的電力瓶頸等內(nèi)容,并提供了比較完整的解決方案。
《深入分析Java Web技術(shù)內(nèi)幕(修訂版)》主要圍繞Java Web 相關(guān)技術(shù)從三方面全面、深入地進(jìn)行了闡述。首先介紹前端知識(shí),即在JavaWeb 開(kāi)發(fā)中涉及的一些基本知識(shí),包括Web 請(qǐng)求過(guò)程、HTTP、DNS 技術(shù)和CDN 技術(shù)。其次深入介紹了Java 技術(shù),包括I/O 技術(shù)、中文編碼問(wèn)題、Javac 編譯原理、class 文件結(jié)構(gòu)解析、ClassLoader 工作機(jī)制及JVM 的內(nèi)存管理等。最后介紹了Java 服務(wù)端技術(shù),主要包括Servlet、Session 與Cookie、Tomcat 與Jetty服務(wù)器、Spring 容器、iBatis 框架和Velocity 框架等原理介紹,并介紹了服務(wù)端的一些優(yōu)化技術(shù)。
《深入分析Java Web技術(shù)內(nèi)幕(修訂版)》不僅介紹這些技術(shù)和框架的工作原理,而且結(jié)合示例來(lái)講解,通過(guò)通俗易懂的文字和豐富、生動(dòng)的配圖,讓讀者充分并深入理解它們的內(nèi)部工作原理,同時(shí)還結(jié)合了設(shè)計(jì)模式來(lái)介紹這些技術(shù)背后的架構(gòu)思維。
2009年加入淘寶,一直關(guān)注性能優(yōu)化領(lǐng)域,經(jīng)歷了淘寶PV從1億到10億的發(fā)展歷程,參與了淘寶高訪問(wèn)量Web系統(tǒng)模板引擎的改造、靜態(tài)化、無(wú)線化、CDN等優(yōu)化改造項(xiàng)目。
先后研究過(guò)分布式數(shù)據(jù)庫(kù)Cassandra系統(tǒng)、Tomcat、Jetty等系統(tǒng)的源碼。一直參與淘寶訪問(wèn)量最高的系統(tǒng)頁(yè)面詳情系統(tǒng)的優(yōu)化工作,設(shè)計(jì)并實(shí)現(xiàn)了sketch模板引擎、MVC框架Feiba等,將服務(wù)端性能提升近50%左右;所在的性能優(yōu)化小組一直在做詳情的前端優(yōu)化,將詳情頁(yè)的首屏展示時(shí)間縮短為1s之內(nèi)。
第1章 深入Web請(qǐng)求過(guò)程 1
1.1 B/S網(wǎng)絡(luò)架構(gòu)概述 2
1.2 如何發(fā)起一個(gè)請(qǐng)求 4
1.3 HTTP協(xié)議解析 6
1.3.1 查看HTTP信息的工具 8
1.3.2 瀏覽器緩存機(jī)制 9
1.4 DNS域名解析 12
1.4.1 DNS域名解析過(guò)程 12
1.4.2 跟蹤域名解析過(guò)程 15
1.4.3 清除緩存的域名 18
1.4.4 幾種域名解析方式 19
1.5 CDN工作機(jī)制 20
1.5.1 CDN架構(gòu) 20
1.5.2 負(fù)載均衡 21
1.5.3 CDN動(dòng)態(tài)加速 24
1.6 總結(jié) 25
第2章 深入分析Java I/O的工作機(jī)制 26
2.1 Java的I/O類(lèi)庫(kù)的基本架構(gòu) 26
2.1.1 基于字節(jié)的I/O操作接口 27
2.1.2 基于字符的I/O操作接口 28
2.1.3 字節(jié)與字符的轉(zhuǎn)化接口 29
2.2 磁盤(pán)I/O工作機(jī)制 30
2.2.1 幾種訪問(wèn)文件的方式 30
2.2.2 Java訪問(wèn)磁盤(pán)文件 34
2.2.3 Java序列化技術(shù) 35
2.3 網(wǎng)絡(luò)I/O工作機(jī)制 37
2.3.1 TCP狀態(tài)轉(zhuǎn)化 38
2.3.2 影響網(wǎng)絡(luò)傳輸?shù)囊蛩?40
2.3.3 Java Socket的工作機(jī)制 40
2.3.4 建立通信鏈路 41
2.3.5 數(shù)據(jù)傳輸 42
2.4 NIO的工作方式 42
2.4.1 BIO帶來(lái)的挑戰(zhàn) 42
2.4.2 NIO的工作機(jī)制 43
2.4.3 Buffer的工作方式 46
2.4.4 NIO的數(shù)據(jù)訪問(wèn)方式 48
2.5 I/O調(diào)優(yōu) 50
2.5.1 磁盤(pán)I/O優(yōu)化 50
2.5.2 TCP網(wǎng)絡(luò)參數(shù)調(diào)優(yōu) 51
2.5.3 網(wǎng)絡(luò)I/O優(yōu)化 53
2.6 設(shè)計(jì)模式解析之適配器模式 57
2.6.1 適配器模式的結(jié)構(gòu) 57
2.6.2 Java I/O中的適配器模式 58
2.7 設(shè)計(jì)模式解析之裝飾器模式 58
2.7.1 裝飾器模式的結(jié)構(gòu) 59
2.7.2 Java I/O中的裝飾器模式 59
2.8 適配器模式與裝飾器模式的區(qū)別 60
2.9 總結(jié) 60
第3章 深入分析Java Web中的中文編碼問(wèn)題 61
3.1 幾種常見(jiàn)的編碼格式 61
3.1.1 為什么要編碼 61
3.1.2 如何“翻譯” 62
3.2 在Java中需要編碼的場(chǎng)景 64
3.2.1 在I/O操作中存在的編碼 64
3.2.2 在內(nèi)存操作中的編碼 66
3.3 在Java中如何編解碼 67
3.3.1 按照ISO-8859-1編碼 69
3.3.2 按照GB2312編碼 70
3.3.3 按照GBK編碼 71
3.3.4 按照UTF-16編碼 71
3.3.5 按照UTF-8編碼 72
3.3.6 UTF-8編碼代碼片段 72
3.3.7 對(duì)幾種編碼格式的比較 74
3.4 在Java Web中涉及的編解碼 74
3.4.1 URL的編解碼 76
3.4.2 HTTP Header的編解碼 79
3.4.3 POST表單的編解碼 79
3.4.4 HTTP BODY的編解碼 80
3.5 JS中的編碼問(wèn)題 81
3.5.1 外部引入JS文件 81
3.5.2 JS的URL編碼 82
3.5.3 其他需要編碼的地方 84
3.6 常見(jiàn)問(wèn)題分析 84
3.6.1 中文變成了看不懂的字符 84
3.6.2 一個(gè)漢字變成一個(gè)問(wèn)號(hào) 85
3.6.3 一個(gè)漢字變成兩個(gè)問(wèn)號(hào) 85
3.6.4 一種不正常的正確編碼 86
3.7 一種繁簡(jiǎn)轉(zhuǎn)換的實(shí)現(xiàn)方式 87
3.8 總結(jié) 88
第4章 Javac編譯原理 89
4.1 Javac是什么 90
4.2 Javac編譯器的基本結(jié)構(gòu) 90
4.3 Javac工作原理分析 92
4.3.1 詞法分析器 93
4.3.2 語(yǔ)法分析器 100
4.3.3 語(yǔ)義分析器 105
4.3.4 代碼生成器 115
4.4 設(shè)計(jì)模式解析之訪問(wèn)者模式 118
4.4.1 訪問(wèn)者模式的結(jié)構(gòu) 119
4.4.2 Javac中訪問(wèn)者模式的實(shí)現(xiàn) 120
4.5 總結(jié) 121
第5章 深入class文件結(jié)構(gòu) 122
5.1 JVM指令集簡(jiǎn)介 122
5.1.1 與類(lèi)相關(guān)的指令 124
5.1.2 方法的定義 125
5.1.3 屬性的定義 126
5.1.4 其他指令集 127
5.2 class文件頭的表示形式 135
5.3 常量池 139
5.3.1 UTF8常量類(lèi)型 142
5.3.2 Fieldref、Methodref常量類(lèi)型 143
5.3.3 Class常量類(lèi)型 143
5.3.4 NameAndType常量類(lèi)型 144
5.4 類(lèi)信息 144
5.5 Fields和Methods定義 145
5.6 類(lèi)屬性描述 149
5.7 Javap生成的class文件結(jié)構(gòu) 150
5.7.1 LineNumberTable 152
5.7.2 LocalVariableTable 153
5.8 總結(jié) 155
第6章 深入分析ClassLoader工作機(jī)制 156
6.1 ClassLoader類(lèi)結(jié)構(gòu)分析 157
6.2 ClassLoader的等級(jí)加載機(jī)制 158
6.3 如何加載class文件 161
6.3.1 加載字節(jié)碼到內(nèi)存 161
6.3.2 驗(yàn)證與解析 163
6.3.3 初始化Class對(duì)象 163
6.4 常見(jiàn)加載類(lèi)錯(cuò)誤分析 163
6.4.1 ClassNotFoundException 163
6.4.2 NoClassDefFoundError 164
6.4.3 UnsatisfiedLinkError 165
6.4.4 ClassCastException 166
6.4.5 ExceptionInInitializerError 167
6.5 常用的ClassLoader分析 168
6.6 如何實(shí)現(xiàn)自己的ClassLoader 172
6.6.1 加載自定義路徑下的class文件 172
6.6.2 加載自定義格式的class文件 174
6.7 實(shí)現(xiàn)類(lèi)的熱部署 176
6.8 Java應(yīng)不應(yīng)該動(dòng)態(tài)加載類(lèi) 178
6.9 總結(jié) 179
第7章 JVM體系結(jié)構(gòu)與工作方式 180
7.1 JVM體系結(jié)構(gòu) 180
7.1.1 何謂JVM 180
7.1.2 JVM體系結(jié)構(gòu)詳解 183
7.2 JVM工作機(jī)制 185
7.2.1 機(jī)器如何執(zhí)行代碼 185
7.2.2 JVM為何選擇基于棧的架構(gòu) 186
7.2.3 執(zhí)行引擎的架構(gòu)設(shè)計(jì) 187
7.2.4 執(zhí)行引擎的執(zhí)行過(guò)程 188
7.2.5 JVM方法調(diào)用棧 193
7.3 總結(jié) 197
第8章 JVM內(nèi)存管理 198
8.1 物理內(nèi)存與虛擬內(nèi)存 199
8.2 內(nèi)核空間與用戶空間 200
8.3 在Java中哪些組件需要使用內(nèi)存 201
8.3.1 Java堆 201
8.3.2 線程 201
8.3.3 類(lèi)和類(lèi)加載器 202
8.3.4 NIO 202
8.3.5 JNI 203
8.4 JVM內(nèi)存結(jié)構(gòu) 203
8.4.1 PC寄存器 204
8.4.2 Java棧 204
8.4.3 堆 205
8.4.4 方法區(qū) 205
8.4.5 運(yùn)行時(shí)常量池 206
8.4.6 本地方法棧 206
8.5 JVM內(nèi)存分配策略 206
8.5.1 通常的內(nèi)存分配策略 207
8.5.2 Java中的內(nèi)存分配詳解 207
8.6 JVM內(nèi)存回收策略 212
8.6.1 靜態(tài)內(nèi)存分配和回收 212
8.6.2 動(dòng)態(tài)內(nèi)存分配和回收 213
8.6.3 如何檢測(cè)垃圾 213
8.6.4 基于分代的垃圾收集算法 215
8.7 內(nèi)存問(wèn)題分析 224
8.7.1 GC日志分析 224
8.7.2 堆快照文件分析 227
8.7.3 JVM Crash日志分析 227
8.8 實(shí)例1 233
8.9 實(shí)例2 235
8.10 實(shí)例3 237
8.11 總結(jié) 242
第9章 Servlet工作原理解析 243
9.1 從Servlet容器說(shuō)起 243
9.1.1 Servlet容器的啟動(dòng)過(guò)程 244
9.1.2 Web應(yīng)用的初始化工作 247
9.2 創(chuàng)建Servlet實(shí)例 249
9.2.1 創(chuàng)建Servlet對(duì)象 250
9.2.2 初始化Servlet 250
9.3 Servlet體系結(jié)構(gòu) 252
9.4 Servlet如何工作 255
9.5 Servlet中的Listener 257
9.6 Filter如何工作 259
9.7 Servlet中的url-pattern 261
9.8 總結(jié) 262
第10章 深入理解Session與Cookie 263
10.1 理解Cookie 264
10.1.1 Cookie屬性項(xiàng) 264
10.1.2 Cookie如何工作 265
10.1.3 使用Cookie的限制 268
10.2 理解Session 269
10.2.1 Session與Cookie 269
10.2.2 Session如何工作 270
10.3 Cookie安全問(wèn)題 273
10.4 分布式Session框架 274
10.4.1 存在哪些問(wèn)題 274
10.4.2 可以解決哪些問(wèn)題 275
10.4.3 總體實(shí)現(xiàn)思路 275
10.5 Cookie壓縮 280
10.6 表單重復(fù)提交問(wèn)題 282
10.7 多終端Session統(tǒng)一 283
10.8 總結(jié) 285
第11章 Tomcat的系統(tǒng)架構(gòu)與設(shè)計(jì)模式 286
11.1 Tomcat總體設(shè)計(jì) 286
11.1.1 Tomcat總體結(jié)構(gòu) 287
11.1.2 Connector組件 293
11.1.3 Servlet容器Container 298
11.1.4 Tomcat中的其他組件 309
11.2 Tomcat中的設(shè)計(jì)模式 309
11.2.1 門(mén)面設(shè)計(jì)模式 309
11.2.2 觀察者設(shè)計(jì)模式 311
11.2.3 命令設(shè)計(jì)模式 313
11.2.4 責(zé)任鏈設(shè)計(jì)模式 314
11.3 總結(jié) 316
第12章 Jetty的工作原理解析 317
12.1 Jetty的基本架構(gòu) 317
12.1.1 Jetty的基本架構(gòu)簡(jiǎn)介 317
12.1.2 Handler的體系結(jié)構(gòu) 319
12.2 Jetty的啟動(dòng)過(guò)程 320
12.3 接受請(qǐng)求 321
12.3.1 基于HTTP協(xié)議工作 321
12.3.2 基于AJP工作 323
12.3.3 基于NIO方式工作 326
12.4 處理請(qǐng)求 327
12.5 與JBoss集成 330
12.6 與Tomcat的比較 331
12.6.1 架構(gòu)比較 331
12.6.2 性能比較 332
12.6.3 特性比較 332
12.7 總結(jié) 333
第13章 Spring框架的設(shè)計(jì)理念與設(shè)計(jì)模式分析 334
13.1 Spring的骨骼架構(gòu) 334
13.1.1 Spring的設(shè)計(jì)理念 335
13.1.2 核心組件如何協(xié)同工作 336
13.2 核心組件詳解 337
13.2.1 Bean組件 337
13.2.2 Context組件 339
13.2.3 Core組件 340
13.2.4 Ioc容器如何工作 342
13.3 Spring中AOP的特性詳解 352
13.3.1 動(dòng)態(tài)代理的實(shí)現(xiàn)原理 352
13.3.2 Spring AOP如何實(shí)現(xiàn) 355
13.4 設(shè)計(jì)模式解析之代理模式 358
13.4.1 代理模式原理 358
13.4.2 Spring中代理模式的實(shí)現(xiàn) 358
13.5 設(shè)計(jì)模式解析之策略模式 361
13.5.1 策略模式原理 361
13.5.2 Spring中策略模式的實(shí)現(xiàn) 362
13.6 總結(jié) 362
第14章 Spring MVC工作機(jī)制與設(shè)計(jì)模式 364
14.1 Spring MVC的總體設(shè)計(jì) 364
14.2 Control設(shè)計(jì) 369
14.2.1 HandlerMapping初始化 370
14.2.2 HandlerAdapter初始化 372
14.2.3 Control的調(diào)用邏輯 373
14.3 Model設(shè)計(jì) 374
14.4 View設(shè)計(jì) 375
14.5 框架設(shè)計(jì)的思考 377
14.5.1 為什么需要框架 377
14.5.2 需要什么樣的框架 377
14.5.3 框架設(shè)計(jì)的原則 378
14.5.4 “指航燈” 378
14.5.5 最基本的原則 378
14.6 設(shè)計(jì)模式解析之模板模式 379
14.6.1 模板模式的結(jié)構(gòu) 379
14.6.2 Spring MVC中的模板模式示例 379
14.7 總結(jié) 380
第15章 深入分析Ibatis框架之系統(tǒng)架構(gòu)與映射原理 381
15.1 Ibatis框架主要的類(lèi)層次結(jié)構(gòu) 381
15.2 Ibatis框架的設(shè)計(jì)策略 382
15.3 Ibatis框架的運(yùn)行原理 384
15.4 示例 386
15.5 Ibatis對(duì)SQL語(yǔ)句的解析 388
15.6 數(shù)據(jù)庫(kù)字段映射到Java對(duì)象 389
15.7 示例運(yùn)行的結(jié)果 391
15.8 設(shè)計(jì)模式解析之簡(jiǎn)單工廠模式 391
15.8.1 簡(jiǎn)單工廠模式的實(shí)現(xiàn)原理 391
15.8.2 在Ibatis中的簡(jiǎn)單工廠模式示例 392
15.9 設(shè)計(jì)模式解析之工廠模式 393
15.9.1 工廠模式的實(shí)現(xiàn)原理 393
15.9.2 Ibatis中的工廠模式示例 394
15.10 總結(jié) 395
第16章 Velocity工作原理解析 397
16.1 Velocity總體架構(gòu) 398
16.2 JJTree渲染過(guò)程解析 401
16.2.1 #set語(yǔ)法 405
16.2.2 Velocity的方法調(diào)用 406
16.2.3 #if、#elseif和#else語(yǔ)法 409
16.2.4 #foreach語(yǔ)法 410
16.2.5 #parse語(yǔ)法 412
16.3 事件處理機(jī)制 413
16.4 常用優(yōu)化技巧 416
16.4.1 減少樹(shù)的總節(jié)點(diǎn)數(shù)量 416
16.4.2 減少渲染耗時(shí)的節(jié)點(diǎn)數(shù)量 416
16.5 與JSP比較 417
16.5.1 JSP渲染機(jī)制 417
16.5.2 Velocity與JSP 423
16.6 設(shè)計(jì)模式解析之合成模式 423
16.6.1 合成模式的結(jié)構(gòu) 423
16.6.2 Velocity中合成模式的實(shí)現(xiàn) 424
16.7 設(shè)計(jì)模式解析之解釋器模式 425
16.7.1 解釋器模式的結(jié)構(gòu) 425
16.7.2 Velocity中解釋器模式的實(shí)現(xiàn) 426
16.8 總結(jié) 426
第17章 Velocity優(yōu)化實(shí)踐 427
17.1 現(xiàn)實(shí)存在的問(wèn)題 427
17.2 優(yōu)化的理論基礎(chǔ) 428
17.2.1 程序語(yǔ)言的三角形結(jié)構(gòu) 428
17.2.2 數(shù)據(jù)結(jié)構(gòu)減少抽象化 429
17.2.3 簡(jiǎn)單的程序復(fù)雜化 429
17.2.4 減少翻譯的代價(jià) 430
17.2.5 變的轉(zhuǎn)化為不變 430
17.3 一個(gè)高效的模板引擎的實(shí)現(xiàn)思路 430
17.3.1 vm模板如何被編譯 432
17.3.2 方法調(diào)用的無(wú)反射優(yōu)化 439
17.3.3 將字符輸出改成字節(jié)輸出 442
17.4 優(yōu)化的成果 443
17.4.1 將char轉(zhuǎn)成byte 443
17.4.2 無(wú)反射執(zhí)行 444
17.5 其他優(yōu)化手段 445
17.6 總結(jié) 445
第18章 大瀏覽量系統(tǒng)的靜態(tài)化架構(gòu)設(shè)計(jì) 446
18.1 淘寶大瀏覽量商品詳情系統(tǒng)簡(jiǎn)介 446
18.2 系統(tǒng)面臨哪些挑戰(zhàn) 447
18.3 淘寶前臺(tái)系統(tǒng)的優(yōu)化歷程 449
18.4 大瀏覽量系統(tǒng)的靜態(tài)改造 449
18.4.1 什么是靜態(tài)化系統(tǒng) 449
18.4.2 為什么要進(jìn)行靜態(tài)化架構(gòu)設(shè)計(jì) 450
18.4.3 如何改造動(dòng)態(tài)系統(tǒng) 451
18.4.4 幾種靜態(tài)化方案的設(shè)計(jì)及選擇 453
18.4.5 如何解決失效問(wèn)題 458
18.4.6 服務(wù)端靜態(tài)化方案的演進(jìn):CDN化 459
18.5 總結(jié) 462