
掃描右側(cè)圖片或微信搜索 “ Java技術(shù)分享屋 ” ,回復 “ 驗證碼 ” ,獲取驗證密碼。
本資料僅供讀者預覽及學習交流使用,不能用于商業(yè)用途,請在下載后24小時內(nèi)刪除。如果喜歡,請購買正版!
一.資料截圖
二.資料介紹
隨著越來越多的第三方語言(Groovy、Scala、JRuby等)在Java虛擬機上運行,Java也儼然成為了一個充滿活力的生態(tài)圈?!秾崙?zhàn)Java虛擬機——JVM故障診斷與性能優(yōu)化》將通過200余示例詳細介紹Java虛擬機中的各種參數(shù)配置、故障排查、性能監(jiān)控以及性能優(yōu)化。
《實戰(zhàn)Java虛擬機——JVM故障診斷與性能優(yōu)化》共11章。第1~3章介紹了Java虛擬機的定義、總體架構(gòu)、常用配置參數(shù)。第4~5章介紹了垃圾回收的算法和各種垃圾回收器。第6章介紹了Java虛擬機的性能監(jiān)控和故障診斷工具。第7章詳細介紹了對Java堆的分析方法和案例。第8章介紹了Java虛擬機對多線程,尤其是對鎖的支持。第9~10章介紹了Java虛擬機的核心——Class文件結(jié)構(gòu),以及Java虛擬機中類的裝載系統(tǒng)。第11章介紹了Java虛擬機的執(zhí)行系統(tǒng)和字節(jié)碼,并給出了通過ASM框架進行字節(jié)碼注入的案例。
《實戰(zhàn)Java虛擬機——JVM故障診斷與性能優(yōu)化》不僅適合Java程序員,還適合任何一名工作于Java虛擬機之上的研發(fā)人員、軟件設計師、架構(gòu)師。
三.資料目錄
第1章 初探Java虛擬機 1
1.1 知根知底:追溯Java的發(fā)展歷程 2
1.1.1 那些依托Java虛擬機的語言大咖們 2
1.1.2 Java發(fā)展史上的里程碑 2
1.2 跨平臺的真相:Java虛擬機來做中介 4
1.2.1 理解Java虛擬機的原理 4
1.2.2 看清Java虛擬機的種類 5
1.3 一切看我的:Java語言規(guī)范 6
1.3.1 詞法的定義 6
1.3.2 語法的定義 7
1.3.3 數(shù)據(jù)類型的定義 8
1.3.4 Java語言規(guī)范總結(jié) 9
1.4 一切聽我的:Java虛擬機規(guī)范 9
1.5 數(shù)字編碼就是計算機世界的水和電 10
1.5.1 整數(shù)在Java虛擬機中的表示 10
1.5.2 浮點數(shù)在Java虛擬機中的表示 12
1.6 拋磚引玉:編譯和調(diào)試虛擬機 14
1.7 小結(jié) 19
第2章 認識Java虛擬機的基本結(jié)構(gòu) 20
2.1 謀全局者才能成大器:看穿Java虛擬機的架構(gòu) 20
2.2 小參數(shù)能解決大問題:學會設置Java虛擬機的參數(shù) 22
2.3 對象去哪兒:辨清Java堆 23
2.4 函數(shù)如何調(diào)用:出入Java棧 25
2.4.1 局部變量表 27
2.4.2 操作數(shù)棧 32
2.4.3 幀數(shù)據(jù)區(qū) 32
2.4.4 棧上分配 33
2.5 類去哪兒了:識別方法區(qū) 35
2.6 小結(jié) 37
第3章 常用Java虛擬機參數(shù) 38
3.1 一切運行都有跡可循:掌握跟蹤調(diào)試參數(shù) 38
3.1.1 跟蹤垃圾回收——讀懂虛擬機日志 39
3.1.2 類加載/卸載的跟蹤 42
3.1.3 系統(tǒng)參數(shù)查看 44
3.2 讓性能飛起來:學習堆的配置參數(shù) 45
3.2.1 最大堆和初始堆的設置 45
3.2.2 新生代的配置 49
3.2.3 堆溢出處理 52
3.3 別讓性能有缺口:了解非堆內(nèi)存的參數(shù)配置 54
3.3.1 方法區(qū)配置 55
3.3.2 棧配置 55
3.3.3 直接內(nèi)存配置 55
3.4 Client和Server二選一:虛擬機的工作模式 58
3.5 小結(jié) 59
第4章 垃圾回收概念與算法 60
4.1 內(nèi)存管理清潔工:認識垃圾回收 60
4.2 清潔工具大PK:討論常用的垃圾回收算法 61
4.2.1 引用計數(shù)法(Reference Counting) 62
4.2.2 標記清除法(Mark-Sweep) 63
4.2.3 復制算法(Copying) 64
4.2.4 標記壓縮法(Mark-Compact) 66
4.2.5 分代算法(Generational Collecting) 67
4.2.6 分區(qū)算法(Region) 68
4.3 誰才是真正的垃圾:判斷可觸及性 69
4.3.1 對象的復活 69
4.3.2 引用和可觸及性的強度 71
4.3.3 軟引用——可被回收的引用 72
4.3.4 弱引用——發(fā)現(xiàn)即回收 76
4.3.5 虛引用——對象回收跟蹤 77
4.4 垃圾回收時的停頓現(xiàn)象:Stop-The-World案例實戰(zhàn) 79
4.5 小結(jié) 83
第5章 垃圾收集器和內(nèi)存分配 84
5.1 一心一意一件事:串行回收器 85
5.1.1 新生代串行回收器 85
5.1.2 老年代串行回收器 86
5.2 人多力量大:并行回收器 86
5.2.1 新生代ParNew回收器 87
5.2.2 新生代ParallelGC回收器 88
5.2.3老年代ParallelOldGC回收器 89
5.3 一心多用都不落下:CMS回收器 90
5.3.1 CMS主要工作步驟 90
5.3.2 CMS主要的設置參數(shù) 91
5.3.3 CMS的日志分析 92
5.3.4 有關Class的回收 94
5.4 未來我做主:G1回收器 95
5.4.1 G1的內(nèi)存劃分和主要收集過程 95
5.4.2 G1的新生代GC 96
5.4.3 G1的并發(fā)標記周期 97
5.4.4 混合回收 100
5.4.5 必要時的Full GC 102
5.4.6 G1日志 102
5.4.7 G1相關的參數(shù) 106
5.5 回眸:有關對象內(nèi)存分配和回收的一些細節(jié)問題 107
5.5.1 禁用System.gc() 107
5.5.2 System.gc()使用并發(fā)回收 107
5.5.3 并行GC前額外觸發(fā)的新生代GC 109
5.5.4 對象何時進入老年代 110
5.5.5 在TLAB上分配對象 117
5.5.6 方法finalize()對垃圾回收的影響 120
5.6 溫故又知新:常用的GC參數(shù) 125
5.7 動手才是真英雄:垃圾回收器對Tomcat性能影響的實驗 127
5.7.1 配置實驗環(huán)境 127
5.7.2 配置進行性能測試的工具JMeter 128
5.7.3 配置Web應用服務器Tomcat 131
5.7.4 實戰(zhàn)案例1——初試串行回收器 133
5.7.5 實戰(zhàn)案例2——擴大堆以提升系統(tǒng)性能 133
5.7.6 實戰(zhàn)案例3——調(diào)整初始堆大小 134
5.7.7 實戰(zhàn)案例4——使用ParrellOldGC回收器 135
5.7.8 實戰(zhàn)案例5——使用較小堆提高GC壓力 135
5.7.9 實戰(zhàn)案例6——測試ParallelOldGC的表現(xiàn) 135
5.7.10 實戰(zhàn)案例7——測試ParNew回收器的表現(xiàn) 136
5.7.11 實戰(zhàn)案例8——測試JDK 1.6的表現(xiàn) 136
5.7.12 實戰(zhàn)案例9——使用高版本虛擬機提升性能 137
5.8 小結(jié) 137
第6章 性能監(jiān)控工具 138
6.1 有我更高效:Linux下的性能監(jiān)控工具 139
6.1.1 顯示系統(tǒng)整體資源使用情況——top命令 139
6.1.2 監(jiān)控內(nèi)存和CPU——vmstat命令 140
6.1.3 監(jiān)控IO使用——iostat命令 142
6.1.4 多功能診斷器——pidstat工具 143
6.2 用我更高效:Windows下的性能監(jiān)控工具 148
6.2.1 任務管理器 148
6.2.2 perfmon性能監(jiān)控工具 150
6.2.3 Process Explorer進程管理工具 153
6.2.4 pslist命令——Windows下也有命令行工具 155
6.3 外科手術(shù)刀:JDK性能監(jiān)控工具 157
6.3.1 查看Java進程——jps命令 158
6.3.2 查看虛擬機運行時信息——jstat命令 159
6.3.3 查看虛擬機參數(shù)——jinfo命令 162
6.3.4 導出堆到文件——jmap命令 163
6.3.5 JDK自帶的堆分析工具——jhat命令 165
6.3.6 查看線程堆?!猨stack命令 167
6.3.7 遠程主機信息收集——jstatd命令 170
6.3.8 多功能命令行——jcmd命令 172
6.3.9 性能統(tǒng)計工具——hprof 175
6.3.10 擴展jps命令 177
6.4 我是你的眼:圖形化虛擬機監(jiān)控工具JConsole 178
6.4.1 JConsole連接Java程序 178
6.4.2 Java程序概況 179
6.4.3 內(nèi)存監(jiān)控 180
6.4.4 線程監(jiān)控 180
6.4.5 類加載情況 182
6.4.6 虛擬機信息 182
6.5 一目了然:可視化性能監(jiān)控工具Visual VM 183
6.5.1 Visual VM連接應用程序 184
6.5.2 監(jiān)控應用程序概況 185
6.5.3 Thread Dump和分析 186
6.5.4 性能分析 187
6.5.5 內(nèi)存快照分析 189
6.5.6 BTrace介紹 190
6.6 來自JRockit的禮物:虛擬機診斷工具Mission Control 198
6.6.1 MBean服務器 198
6.6.2 飛機記錄器(Flight Recorder) 200
6.7 小結(jié) 203
第7章 分析Java堆 204
7.1 對癥才能下藥:找到內(nèi)存溢出的原因 205
7.1.1 堆溢出 205
7.1.2 直接內(nèi)存溢出 205
7.1.3 過多線程導致OOM 207
7.1.4 永久區(qū)溢出 209
7.1.5 GC效率低下引起的OOM 210
7.2 無處不在的字符串:String在虛擬機中的實現(xiàn) 210
7.2.1 String對象的特點 210
7.2.2 有關String的內(nèi)存泄漏 212
7.2.3 有關String常量池的位置 215
7.3 虛擬機也有內(nèi)窺鏡:使用MAT分析Java堆 217
7.3.1 初識MAT 217
7.3.2 淺堆和深堆 220
7.3.3例解MAT堆分析 221
7.3.4支配樹(Dominator Tree) 225
7.3.5 Tomcat堆溢出分析 226
7.4 篩選堆對象:MAT對OQL的支持 230
7.4.1 Select子句 230
7.4.2 From子句 232
7.4.3 Where子句 234
7.4.4 內(nèi)置對象與方法 234
7.5 更精彩的查找:Visual VM對OQL的支持 239
7.5.1 Visual VM的OQL基本語法 239
7.5.2 內(nèi)置heap對象 240
7.5.3 對象函數(shù) 242
7.5.4 集合/統(tǒng)計函數(shù) 247
7.5.5 程序化OQL分析Tomcat堆 252
7.6 小結(jié) 255
第8章 鎖與并發(fā) 256
8.1 安全就是鎖存在的理由:鎖的基本概念和實現(xiàn) 257
8.1.1 理解線程安全 257
8.1.2 對象頭和鎖 259
8.2 避免殘酷的競爭:鎖在Java虛擬機中的實現(xiàn)和優(yōu)化 260
8.2.1 偏向鎖 260
8.2.2 輕量級鎖 262
8.2.3 鎖膨脹 263
8.2.4 自旋鎖 264
8.2.5 鎖消除 264
8.3 應對殘酷的競爭:鎖在應用層的優(yōu)化思路 266
8.3.1 減少鎖持有時間 266
8.3.2 減小鎖粒度 267
8.3.3 鎖分離 269
8.3.4 鎖粗化 271
8.4 無招勝有招:無鎖 273
8.4.1 理解CAS 273
8.4.2 原子操作 274
8.4.3 新寵兒LongAddr 277
8.5 將隨機變?yōu)榭煽兀豪斫釰ava內(nèi)存模型 280
8.5.1 原子性 280
8.5.2 有序性 282
8.5.3 可見性 284
8.5.4 Happens-Before原則 286
8.6 小結(jié) 286
第9章 Class文件結(jié)構(gòu) 287
9.1 不僅跨平臺,還能跨語言:語言無關性 287
9.2 虛擬機的基石:Class文件 289
9.2.1 Class文件的標志——魔數(shù) 290
9.2.2 Class文件的版本 292
9.2.3 存放所有常數(shù)——常量池 293
9.2.4 Class的訪問標記(Access Flag) 300
9.2.5 當前類、父類和接口 301
9.2.6 Class文件的字段 302
9.2.7 Class文件的方法基本結(jié)構(gòu) 304
9.2.8 方法的執(zhí)行主體——Code屬性 306
9.2.9 記錄行號——LineNumberTable屬性 307
9.2.10 保存局部變量和參數(shù)——LocalVariableTable屬性 308
9.2.11 加快字節(jié)碼校驗——StackMapTable屬性 308
9.2.12Code屬性總結(jié) 313
9.2.13 拋出異常——Exceptions屬性 314
9.2.14 用實例分析Class的方法結(jié)構(gòu) 315
9.2.15 我來自哪里——SourceFile屬性 318
9.2.16 強大的動態(tài)調(diào)用——BootstrapMethods屬性 319
9.2.17內(nèi)部類——InnerClasses屬性 320
9.2.18 將要廢棄的通知——Deprecated屬性 321
9.2.19Class文件總結(jié) 322
9.3 操作字節(jié)碼:走進ASM 322
9.3.1 ASM體系結(jié)構(gòu) 322
9.3.2 ASM之Hello World 324
9.4 小結(jié) 325
第10章 Class裝載系統(tǒng) 326
10.1 來去都有序:看懂Class文件的裝載流程 326
10.1.1 類裝載的條件 327
10.1.2 加載類 330
10.1.3 驗證類 332
10.1.4 準備 333
10.1.5 解析類 334
10.1.6 初始化 336
10.2 一切Class從這里開始:掌握ClassLoader 340
10.2.1 認識ClassLoader,看懂類加載 341
10.2.2 ClassLoader的分類 341
10.2.3 ClassLoader的雙親委托模式 343
10.2.4 雙親委托模式的弊端 347
10.2.5 雙親委托模式的補充 348
10.2.6 突破雙親模式 350
10.2.7 熱替換的實現(xiàn) 353
10.3 小結(jié) 357
第11章 字節(jié)碼執(zhí)行 358
11.1 代碼如何執(zhí)行:字節(jié)碼執(zhí)行案例 359
11.2 執(zhí)行的基礎:Java虛擬機常用指令介紹 369
11.2.1 常量入棧指令 369
11.2.2 局部變量壓棧指令 370
11.2.3 出棧裝入局部變量表指令 371
11.2.4 通用型操作 372
11.2.5 類型轉(zhuǎn)換指令 373
11.2.6 運算指令 375
11.2.7 對象/數(shù)組操作指令 377
11.2.8 比較控制指令 379
11.2.9 函數(shù)調(diào)用與返回指令 386
11.2.10 同步控制 389
11.2.11 再看Class的方法結(jié)構(gòu) 391
11.3 更上一層樓:再看ASM 393
11.3.1 為類增加安全控制 393
11.3.2 統(tǒng)計函數(shù)執(zhí)行時間 396
11.4 誰說Java太刻板:Java Agent運行時修改類 399
11.4.1 使用-javaagent參數(shù)啟動Java虛擬機 400
11.4.2 使用Java Agent為函數(shù)增加計時功能 402
11.4.3 動態(tài)重轉(zhuǎn)換類 404
11.4.4 有關Java Agent的總結(jié) 407
11.5 與時俱進:動態(tài)函數(shù)調(diào)用 407
11.5.1 方法句柄使用實例 407
11.5.2 調(diào)用點使用實例 411
11.5.3 反射和方法句柄 412
11.5.4 指令invokedynamic使用實例 414
11.6 跑得再快點:靜態(tài)編譯優(yōu)化 418
11.6.1 編譯時計算 419
11.6.2 變量字符串的連接 421
11.6.3 基于常量的條件語句裁剪 422
11.6.4 switch語句的優(yōu)化 423
11.7 提高虛擬機的執(zhí)行效率:JIT及其相關參數(shù) 424
11.7.1 開啟JIT編譯 425
11.7.2 JIT編譯閾值 426
11.7.3 多級編譯器 427
11.7.4 OSR棧上替換 430
11.7.5 方法內(nèi)聯(lián) 431
11.7.6 設置代碼緩存大小 432
11.8 小結(jié) 436