-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

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

( 簡體 字)
作者:葛一鳴類別:1. -> 程式設計 -> JAVA -> Java
譯者:
出版社:電子工業出版社實戰Java虛擬機——JVM故障診斷與性能優化 3dWoo書號: 41075
詢問書籍請說出此書號!

缺書
NT售價: 395

出版日:3/1/2015
頁數:452
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121256127
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

關于Java生態圈
Java是目前應用最為廣泛的軟件開發平臺之一。隨著Java以及Java社區的不斷壯大,Java也早已不再是簡簡單單的一門計算機語言了,它更是一個平臺、一種文化、一個社區。
作為一個平臺,Java虛擬機扮演著舉足輕重的作用。除了Java語言,任何一種能夠被編譯成字節碼的計算機語言都屬于Java這個平臺。Groovy、Scala、JRuby等都是Java平臺的一個部分,它們依賴于Java虛擬機,同時,Java平臺也因為它們變得更加豐富多彩。
作為一種文化,Java幾乎成為了“開源”的代名詞。在Java程序中,有著數不清的開源軟件和框架,如Tomcat、Struts、Hibernate、Spring等。就連JDK和JVM自身也有不少開源的實現,如OpenJDK、Harmony。可以說,“共享”的精神在Java世界里體現得淋漓盡致。
作為一個社區,Java擁有無數的開發人員,有數不清的論壇和資料。從桌面應用軟件、嵌入式開發到企業級應用、后臺服務器、中間件,都可以看到Java的身影。其應用形式之復雜、參與人數之龐大也令人咋舌。可以說,Java社區已經儼然成為了一個良好而龐大的生態系統。
而本書,也將主要介紹這個生態系統的核心——Java虛擬機。
本書的體系結構
本書立足于實際開發,又不缺理論介紹,力求通俗易懂、循序漸進。本書共分為11章:
第1章主要為綜述,介紹了Java虛擬機的概念、定義,講解了Java語言規范和Java虛擬機規范,最后,還介紹了OpenJDK的調試方法。
第2章介紹了虛擬機的總體架構,說明了堆、棧、方法區等內存空間的作用和彼此之間的聯系。
第3章介紹了Java虛擬機的常用配置參數,重點對垃圾回收跟蹤參數、內存配置參數做了詳細的介紹以及案例說明。
第4章從理論層面介紹了垃圾回收的算法,如引用計數、標記清除、標記壓縮、復制算法等。本章是第5章的理論基礎。
第5章講解基于垃圾回收的理論知識,進一步詳細介紹Java虛擬機中實際使用的各種垃圾回收器,包括串行回收器、并行回收器、CMS、G1等。
第6章介紹了虛擬機的性能監控和故障診斷工具,考慮實用性,也介紹了系統級性能監控工具的使用,兩者結合,可以更好地幫助讀者處理實際問題。
第7章詳細介紹了對Java堆的分析方法和案例,主要講解了MAT和Visual VM兩款工具的使用,以及各自OQL的編寫方式。
第8章介紹了Java虛擬機對多線程,尤其是鎖的支持,本章不僅介紹了虛擬機內部鎖的實現、優化機制,也給出了一些Java語言層面的鎖優化思路,最后,還介紹了無鎖的并行控制方法。
第9章介紹了虛擬機的核心——Class文件結構,Class文件作為虛擬機的基石,有著舉足輕重的作用,對深入理解虛擬機有著不可忽視的作用。
第10章介紹了虛擬機中類的裝載系統,其中,著重介紹了虛擬機中ClassLoader的實現以及設計模式。
第11章介紹了虛擬機的執行系統和字節碼,為了幫助讀者更快更好地理解Java字節碼,本章對字節碼進行分類講解,并且理論聯系實際,給出了通過ASM框架進行字節碼注入的案例。
本書特色
本書的主要特點有:
1. 結構清晰。本書采用從整體到局部的視角,首先第1、2兩章介紹了Java虛擬機的整體概況和結構。接著步步為營,每一章節對應一個單獨知識點,力求展示虛擬機的全貌。
2. 理論結合實戰。本書不甘心于簡單地枚舉理論知識,在每一個理論背后,都給出了演示示例供讀者參考,幫助讀者更好地消化這些理論。比如,在對Class文件結構和字節碼的介紹中,不僅僅簡單地給出了理論說明,更是使用ASM框架將這些理論應用于實踐,盡可能地做到理論和實踐結合。
3. 專注專業。本書著眼于Java虛擬機,對Java虛擬機的原理和實踐做了豐富的介紹,包括但不限于體系結構、虛擬機的調試方式、常用參數、垃圾回收系統、Class文件結構、執行系統等,力求從多角度更專業地對Java虛擬機進行探討。
4. 通俗易懂。本書依然服務于廣大虛擬機初學者,盡量避免采用過于理論的描述方式,簡單的白話文風格貫穿全書,盡量做到讀者在閱讀過程中少盲點、無盲點。
5. 技術全面。縱橫Windows和Linux雙系統下的性能診斷、涉及32位系統和64位系統的優化比較、貫穿從JDK 1.5~ JDK 1.8的優化演進。
適合閱讀人群
雖然本書力求通俗,但要通讀本書并取得良好的學習效果,要求讀者需要具備基本的Java知識或者一定的編程經驗。因此,本書適合以下讀者:
擁有一定開發經驗的Java平臺開發人員(Java、Scala、JRuby等)
軟件設計師、架構師
系統調優人員
有一定的Java基礎并希望更進一步的程序員
虛擬機愛好者,JVM實踐者
本書的約定
本書在敘述過程中,有如下約定:
本書中所述的JDK 1.5、JDK 1.6、JDK 1.7、JDK 1.8等同于JDK 5、JDK 6、JDK 7、JDK 8。
如無特殊說明,Java虛擬機均指HotSpot虛擬機。
如無特殊說明,本書的程序、示例均在JDK 1.7環境中運行。
本書贈送的課程優惠券,可以觀看我在51CTO學院的JVM課程,地址是http://edu.51cto. com/course/course_id-1952.html。
聯系作者
本書的寫作過程遠比我想象的更艱辛,為了讓全書能夠更清楚更正確地表達和論述,我經歷了好多個不眠之夜,即使現在回想起來,也忍不住讓我打個寒顫。由于寫作水平的限制,書中難免會有不妥之處,望讀者諒解。
為此,如果讀者有任何疑問或者建議,非常歡迎大家加入QQ群397196583 ,一起探討學習中的困難、分享學習的經驗,我期待與大家一起交流、共同進步。同時,也希望大家可以關注我的博客http://www.uucode.net/。
感謝
這本書能夠面世,是因為得到了眾人的支持。首先,要感謝我的妻子,她始終不辭辛勞,毫無怨言地對我照顧有加,才讓我得以騰出大量時間,并可以安心工作。其次,要感謝小編為我一次又一次地審稿改錯,批評指正,才能讓本書逐步完善。最后,感謝我的母親30年如一日對我的體貼和關心。
參與本書編寫的還有宋玉紅、關碩、安繼宏、白慧、薛淑英、蔣璽、曹靜、馬玉杰、陳明
明、張麗萍、任娜娜、李清藝、荊海霞、趙全利、孫迪,特此感謝!

葛一鳴
內容簡介:

隨著越來越多的第三方語言(Groovy、Scala、JRuby等)在Java虛擬機上運行,Java也儼然成為一個充滿活力的生態圈。本書將通過200余示例詳細介紹Java虛擬機中的各種參數配置、故障排查、性能監控以及性能優化。
本書共11章。第1~3章介紹了Java虛擬機的定義、總體架構、常用配置參數。第4~5章介紹了垃圾回收的算法和各種垃圾回收器。第6章介紹了虛擬機的性能監控和故障診斷工具。第7章詳細介紹了對Java堆的分析方法和案例。第8章介紹了Java虛擬機對多線程,尤其是鎖的支持。第9~10章介紹了虛擬機的核心——Class文件結構,以及虛擬機中類的裝載系統。第11章介紹了虛擬機的執行系統和字節碼,并給出了通過ASM框架進行字節碼注入的案例。

目錄:

第1章 初探Java虛擬機 1
1.1 知根知底:追溯Java的發展歷程 2
1.1.1 那些依托Java虛擬機的語言大咖們 2
1.1.2 Java發展史上的里程碑 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.4 Java語言規范總結 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.4 Client和Server二選一:虛擬機的工作模式 58
3.5 小結 59
第4章 垃圾回收概念與算法 60
4.1 內存管理清潔工:認識垃圾回收 60
4.2 清潔工具大PK:討論常用的垃圾回收算法 61
4.2.1 引用計數法(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 分區算法(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.1 CMS主要工作步驟 90
5.3.2 CMS主要的設置參數 91
5.3.3 CMS的日志分析 92
5.3.4 有關Class的回收 94
5.4 未來我做主:G1回收器 95
5.4.1 G1的內存劃分和主要收集過程 95
5.4.2 G1的新生代GC 96
5.4.3 G1的并發標記周期 97
5.4.4 混合回收 100
5.4.5 必要時的Full GC 102
5.4.6 G1日志 102
5.4.7 G1相關的參數 106
5.5 回眸:有關對象內存分配和回收的一些細節問題 107
5.5.1 禁用System.gc() 107
5.5.2 System.gc()使用并發回收 107
5.5.3 并行GC前額外觸發的新生代GC 109
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 配置進行性能測試的工具JMeter 128
5.7.3 配置Web應用服務器Tomcat 131
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——測試JDK 1.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.2 perfmon性能監控工具 150
6.2.3 Process Explorer進程管理工具 153
6.2.4 pslist命令——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.5 JDK自帶的堆分析工具——jhat命令 165
6.3.6 查看線程堆棧——jstack命令 167
6.3.7 遠程主機信息收集——jstatd命令 170
6.3.8 多功能命令行——jcmd命令 172
6.3.9 性能統計工具——hprof 175
6.3.10 擴展jps命令 177
6.4 我是你的眼:圖形化虛擬機監控工具JConsole 178
6.4.1 JConsole連接Java程序 178
6.4.2 Java程序概況 179
6.4.3 內存監控 180
6.4.4 線程監控 180
6.4.5 類加載情況 182
6.4.6 虛擬機信息 182
6.5 一目了然:可視化性能監控工具Visual VM 183
6.5.1 Visual VM連接應用程序 184
6.5.2 監控應用程序概況 185
6.5.3 Thread Dump和分析 186
6.5.4 性能分析 187
6.5.5 內存快照分析 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 小結 203
第7章 分析Java堆 204
7.1 對癥才能下藥:找到內存溢出的原因 205
7.1.1 堆溢出 205
7.1.2 直接內存溢出 205
7.1.3 過多線程導致OOM 207
7.1.4 永久區溢出 209
7.1.5 GC效率低下引起的OOM 210
7.2 無處不在的字符串:String在虛擬機中的實現 210
7.2.1 String對象的特點 210
7.2.2 有關String的內存泄漏 212
7.2.3 有關String常量池的位置 215
7.3 虛擬機也有內窺鏡:使用MAT分析Java堆 217
7.3.1 初識MAT 217
7.3.2 淺堆和深堆 220
7.3.4 例解MAT堆分析 221
7.3.5 支配樹(Dominator Tree) 225
7.3.6 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 內置對象與方法 234
7.5 更精彩的查找:Visual VM對OQL的支持 239
7.5.1 Visual VM的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 理解CAS 273
8.4.2 原子操作 274
8.4.3 新寵兒LongAddr 277
8.5 將隨機變為可控:理解Java內存模型 280
8.5.1 原子性 280
8.5.2 有序性 282
8.5.3 可見性 284
8.5.4 Happens-Before原則 286
8.6 小結 286
第9章 Class文件結構 287
9.1 不僅跨平臺,還能跨語言:語言無關性 287
9.2 虛擬機的基石:Class文件 289
9.2.1 Class文件的標志——魔數 290
9.2.2 Class文件的版本 292
9.2.3 存放所有常數——常量池 293
9.2.4 Class的訪問標記(Access Flag) 300
9.2.5 當前類、父類和接口 301
9.2.6 Class文件的字段 302
9.2.7 Class文件的方法基本結構 304
9.2.8 方法的執行主體——Code屬性 306
9.2.9 記錄行號——LineNumberTable屬性 307
9.2.10 保存局部變量和參數——LocalVariableTable屬性 308
9.2.11 加快字節碼校驗——StackMapTable屬性 308
9.2.12 Code屬性總結 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.19 Class文件總結 322
9.3 操作字節碼:走進ASM 322
9.3.1 ASM體系結構 322
9.3.2 ASM之Hello World 324
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從這里開始:掌握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 熱替換的實現 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 更上一層樓:再看ASM 393
11.3.1 為類增加安全控制 393
11.3.2 統計函數執行時間 396
11.4 誰說Java太刻板:Java Agent運行時修改類 399
11.4.1 使用-javaagent參數啟動Java虛擬機 400
11.4.2 使用Java Agent為函數增加計時功能 402
11.4.3 動態重轉換類 404
11.4.4 有關Java Agent的總結 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.4 switch語句的優化 423
11.7 提高虛擬機的執行效率:JIT及其相關參數 424
11.7.1 開啟JIT編譯 425
11.7.2 JIT編譯閾值 426
11.7.3 多級編譯器 427
11.7.4 OSR棧上替換 430
11.7.5 方法內聯 431
11.7.6 設置代碼緩存大小 432
11.8 小結 436
序: