實戰Java虛擬機

實戰Java虛擬機——JVM故障診斷與性能最佳化

基本信息

電子工業出版社出版的《實戰Java虛擬機——JVM故障診斷與性能最佳化》,是一本真正讓Java虛擬機的學習人員深入了解JVM的通俗讀物。

實戰java虛擬機封面實戰java虛擬機封面

內容概述

本書將通過200餘示例詳細介紹Java虛擬機中的各種參數配置、故障排查、性能監控以及性能最佳化。
本書共11章。第1~3章介紹了Java虛擬機的定義、總體架構、常用配置參數。第4~5章介紹了垃圾回收的算法和各種垃圾回收器。第6章介紹了虛擬機的性能監控和故障診斷工具。第7章詳細介紹了對Java堆的分析方法和案例。第8章介紹了Java虛擬機對多執行緒,尤其是鎖的支持。第9~10章介紹了虛擬機的核心——Class檔案結構,以及虛擬機中類的裝載系統。第11章介紹了虛擬機的執行系統和位元組碼,並給出了通過ASM框架進行位元組碼注入的案例。

作者簡介

葛一鳴:國家認證系統分析師,獲得OracleOCP認證。長期從事Java軟體開發,對Java程式設計,JVM有一定的研究。對設計模式、人工智慧、神經網路、數據挖掘等技術有濃厚興趣,著有《自己動手寫神經網路》電子書,也開設了線上的《深入淺出JVM》培訓課程,有問題可聯繫作者個人部落格www.uucode.net。

創作背景

隨著越來越多的第三方語言(Groovy、Scala、JRuby等)在Java虛擬機上運行,Java也儼然成為一個充滿活力的生態圈。本書就是在此基礎上寫作而成。

出版信息

電子工業出版社;第1版(2015年3月1日)

目錄

第1章 初探Java虛擬機1
1.1知根知底:追溯Java的發展歷程2
1.1.1那些依託Java虛擬機的語言大咖們2
1.1.2Java發展史上的里程碑2
1.2跨平台的真相:Java虛擬機來做中介4
1.2.1理解Java虛擬機的原理4
1.2.2看清Java虛擬機的種類5
1.3一切看我的:Java語言規範6
1.3.1詞法的定義6
1.3.2語法的定義7
1.3.3數據類型的定義8
1.3.4Java語言規範總結9
1.4一切聽我的:Java虛擬機規範9
1.5數字編碼就是計算機世界的水和電10
1.5.1整數在Java虛擬機中的表示10
1.5.2浮點數在Java虛擬機中的表示12
1.6拋磚引玉:編譯和調試虛擬機14
1.7小結19
第2章 認識Java虛擬機的基本結構20
2.1謀全局者才能成大器:看穿Java虛擬機的架構20
2.2小參數能解決大問題:學會設定Java虛擬機的參數22
2.3對象去哪兒:辨清Java堆23
2.4函式如何調用:出入Java棧25
2.4.1局部變數表27
2.4.2運算元棧32
2.4.3幀數據區32
2.4.4棧上分配33
2.5類去哪兒了:識別方法區35
2.6小結37
第3章 常用Java虛擬機參數38
3.1一切運行都有跡可循:掌握跟蹤調試參數38
3.1.1跟蹤垃圾回收——讀懂虛擬機日誌39
3.1.2類載入/卸載的跟蹤42
3.1.3系統參數查看44
3.2讓性能飛起來:學習堆的配置參數45
3.2.1最大堆和初始堆的設定45
3.2.2新生代的配置49
3.2.3堆溢出處理52
3.3別讓性能有缺口:了解非堆記憶體的參數配置54
3.3.1方法區配置55
3.3.2棧配置55
3.3.3直接記憶體配置55
3.4Client和Server二選一:虛擬機的工作模式58
3.5小結59
第4章 垃圾回收概念與算法60
4.1記憶體管理清潔工:認識垃圾回收60
4.2清潔工具大PK:討論常用的垃圾回收算法61
4.2.1引用計數法(ReferenceCounting)62
4.2.2標記清除法(Mark-Sweep)63
4.2.3複製算法(Copying)64
4.2.4標記壓縮法(Mark-Compact)66
4.2.5分代算法(GenerationalCollecting)67
4.2.6分區算法(Region)68
4.3誰才是真正的垃圾:判斷可觸及性69
4.3.1對象的復活69
4.3.2引用和可觸及性的強度71
4.3.3軟引用——可被回收的引用72
4.3.4弱引用——發現即回收76
4.3.5虛引用——對象回收跟蹤77
4.4垃圾回收時的停頓現象:Stop-The-World案例實戰79
4.5小結83
第5章 垃圾收集器和記憶體分配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.2老年代ParallelOldGC回收器89
5.3一心多用都不落下:CMS回收器90
5.3.1CMS主要工作步驟90
5.3.2CMS主要的設定參數91
5.3.3CMS的日誌分析92
5.3.4有關Class的回收94
5.4未來我做主:G1回收器95
5.4.1G1的記憶體劃分和主要收集過程95
5.4.2G1的新生代GC96
5.4.3G1的並發標記周期97
5.4.4混合回收100
5.4.5必要時的FullGC102
5.4.6G1日誌102
5.4.7G1相關的參數106
5.5回眸:有關對象記憶體分配和回收的一些細節問題107
5.5.1禁用System.gc()107
5.5.2System.gc()使用並發回收107
5.5.3並行GC前額外觸發的新生代GC109
5.5.4對象何時進入老年代110
5.5.5在TLAB上分配對象117
5.5.6方法finalize()對垃圾回收的影響120
5.6溫故又知新:常用的GC參數125
5.7動手才是真英雄:垃圾回收器對Tomcat性能影響的實驗127
5.7.1配置實驗環境127
5.7.2配置進行性能測試的工具JMeter128
5.7.3配置Web套用伺服器Tomcat131
5.7.4實戰案例1——初試串列回收器133
5.7.5實戰案例2——擴大堆以提升系統性能133
5.7.6實戰案例3——調整初始堆大小134
5.7.7實戰案例4——使用ParrellOldGC回收器135
5.7.8實戰案例5——使用較小堆提高GC壓力135
5.7.9實戰案例6——測試ParallelOldGC的表現135
5.7.10實戰案例7——測試ParNew回收器的表現136
5.7.11實戰案例8——測試JDK1.6的表現136
5.7.12實驗9——使用高版本虛擬機提升性能137
5.8小結137
第6章 性能監控工具138
6.1有我更高效:Linux下的性能監控工具139
6.1.1顯示系統整體資源使用情況——top命令139
6.1.2監控記憶體和CPU——vmstat命令140
6.1.3監控IO使用——iostat命令142
6.1.4多功能診斷器——pidstat工具143
6.2用我更高效:Windows下的性能監控工具148
6.2.1任務管理器148
6.2.2perfmon性能監控工具150
6.2.3ProcessExplorer進程管理工具153
6.2.4pslist命令——Windows下也有命令行工具155
6.3外科手術刀:JDK性能監控工具157
6.3.1查看Java進程——jps命令158
6.3.2查看虛擬機運行時信息——jstat命令159
6.3.3查看虛擬機參數——jinfo命令162
6.3.4導出堆到檔案——jmap命令163
6.3.5JDK自帶的堆分析工具——jhat命令165
6.3.6查看執行緒堆疊——jstack命令167
6.3.7遠程主機信息收集——jstatd命令170
6.3.8多功能命令行——jcmd命令172
6.3.9性能統計工具——hprof175
6.3.10擴展jps命令177
6.4我是你的眼:圖形化虛擬機監控工具JConsole178
6.4.1JConsole連線Java程式178
6.4.2Java程式概況179
6.4.3記憶體監控180
6.4.4執行緒監控180
6.4.5類載入情況182
6.4.6虛擬機信息182
6.5一目了然:可視化性能監控工具VisualVM183
6.5.1VisualVM連線應用程式184
6.5.2監控應用程式概況185
6.5.3ThreadDump和分析186
6.5.4性能分析187
6.5.5記憶體快照分析189
6.5.6BTrace介紹190
6.6來自JRockit的禮物:虛擬機診斷工具MissionControl198
6.6.1MBean伺服器198
6.6.2飛機記錄器(FlightRecorder)200
6.7小結203
第7章 分析Java堆204
7.1對症才能下藥:找到記憶體溢出的原因205
7.1.1堆溢出205
7.1.2直接記憶體溢出205
7.1.3過多執行緒導致OOM207
7.1.4永久區溢出209
7.1.5GC效率低下引起的OOM210
7.2無處不在的字元串:String在虛擬機中的實現210
7.2.1String對象的特點210
7.2.2有關String的記憶體泄漏212
7.2.3有關String常量池的位置215
7.3虛擬機也有內窺鏡:使用MAT分析Java堆217
7.3.1初識MAT217
7.3.2淺堆和深堆220
7.3.4例解MAT堆分析221
7.3.5支配樹(DominatorTree)225
7.3.6Tomcat堆溢出分析226
7.4篩選堆對象:MAT對OQL的支持230
7.4.1Select子句230
7.4.2From子句232
7.4.3Where子句234
7.4.4內置對象與方法234
7.5更精彩的查找:VisualVM對OQL的支持239
7.5.1VisualVM的OQL基本語法239
7.5.2內置heap對象240
7.5.3對象函式242
7.5.4集合/統計函式247
7.5.5程式化OQL分析Tomcat堆252
7.6小結255
第8章 鎖與並發256
8.1安全就是鎖存在的理由:鎖的基本概念和實現257
8.1.1理解執行緒安全257
8.1.2對象頭和鎖259
8.2避免殘酷的競爭:鎖在Java虛擬機中的實現和最佳化260
8.2.1偏向鎖260
8.2.2輕量級鎖262
8.2.3鎖膨脹263
8.2.4自旋鎖264
8.2.5鎖消除264
8.3應對殘酷的競爭:鎖在套用層的最佳化思路266
8.3.1減少鎖持有時間266
8.3.2減小鎖粒度267
8.3.3鎖分離269
8.3.4鎖粗化271
8.4無招勝有招:無鎖273
8.4.1理解CAS273
8.4.2原子操作274
8.4.3新寵兒LongAddr277
8.5將隨機變為可控:理解Java記憶體模型280
8.5.1原子性280
8.5.2有序性282
8.5.3可見性284
8.5.4Happens-Before原則286
8.6小結286
第9章 Class檔案結構287
9.1不僅跨平台,還能跨語言:語言無關性287
9.2虛擬機的基石:Class檔案289
9.2.1Class檔案的標誌——魔數290
9.2.2Class檔案的版本292
9.2.3存放所有常數——常量池293
9.2.4Class的訪問標記(AccessFlag)300
9.2.5當前類、父類和接口301
9.2.6Class檔案的欄位302
9.2.7Class檔案的方法基本結構304
9.2.8方法的執行主體——Code屬性306
9.2.9記錄行號——LineNumberTable屬性307
9.2.10保存局部變數和參數——LocalVariableTable屬性308
9.2.11加快位元組碼校驗——StackMapTable屬性308
9.2.12Code屬性總結313
9.2.13拋出異常——Exceptions屬性314
9.2.14用實例分析Class的方法結構315
9.2.15我來自哪裡——SourceFile屬性318
9.2.16強大的動態調用——BootstrapMethods屬性319
9.2.17內部類——InnerClasses屬性320
9.2.18將要廢棄的通知——Deprecated屬性321
9.2.19Class檔案總結322
9.3操作位元組碼:走進ASM322
9.3.1ASM體系結構322
9.3.2ASM之HelloWorld324
9.4小結325
第10章 Class裝載系統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從這裡開始:掌握ClassLoader340
10.2.1認識ClassLoader,看懂類載入341
10.2.2ClassLoader的分類341
10.2.3ClassLoader的雙親委託模式343
10.2.4雙親委託模式的弊端347
10.2.5雙親委託模式的補充348
10.2.6突破雙親模式350
10.2.7熱替換的實現353
10.3小結357
第11章 位元組碼執行358
11.1代碼如何執行:位元組碼執行案例359
11.2執行的基礎:Java虛擬機常用指令介紹369
11.2.1常量入棧指令369
11.2.2局部變數壓棧指令370
11.2.3出棧裝入局部變數表指令371
11.2.4通用型操作372
11.2.5類型轉換指令373
11.2.6運算指令375
11.2.7對象/數組操作指令377
11.2.8比較控制指令379
11.2.9函式調用與返回指令386
11.2.10同步控制389
11.2.11再看Class的方法結構391
11.3更上一層樓:再看ASM393
11.3.1為類增加安全控制393
11.3.2統計函式執行時間396
11.4誰說Java太刻板:JavaAgent運行時修改類399
11.4.1使用-javaagent參數啟動Java虛擬機400
11.4.2使用JavaAgent為函式增加計時功能402
11.4.3動態重轉換類404
11.4.4有關JavaAgent的總結407
11.5與時俱進:動態函式調用407
11.5.1方法句柄使用實例407
11.5.2調用點使用實例411
11.5.3反射和方法句柄412
11.5.4指令invokedynamic使用實例414
11.6跑得再快點:靜態編譯最佳化418
11.6.1編譯時計算419
11.6.2變數字元串的連線421
11.6.3基於常量的條件語句裁剪422
11.6.4switch語句的最佳化423
11.7提高虛擬機的執行效率:JIT及其相關參數424
11.7.1開啟JIT編譯425
11.7.2JIT編譯閾值426
11.7.3多級編譯器427
11.7.4OSR棧上替換430
11.7.5方法內聯431
11.7.6設定代碼快取大小432
11.8小結436

相關詞條

熱門詞條

聯絡我們