舉報

會員
實戰(zhàn)Java虛擬機(jī):JVM故障診斷與性能優(yōu)化(第2版)
最新章節(jié):
反侵權(quán)盜版聲明
不管技術(shù)如何發(fā)展,Java依然是一個充滿活力的生態(tài)圈,學(xué)習(xí)Java的人也越來越多,但多數(shù)人學(xué)習(xí)Java虛擬機(jī)(JVM)時都會遇到瓶頸。本書將通過200余個示例詳細(xì)介紹JVM中的各種參數(shù)配置、故障排查、性能監(jiān)控及性能優(yōu)化,幫助Java人突破瓶頸。本書共11章,修訂后版本涵蓋Java6~Java10。第1~3章介紹了Java虛擬機(jī)的定義、總體架構(gòu)、常用配置參數(shù)。第4~5章介紹了垃圾回收的算法和各種垃圾回收器。第6章介紹了Java虛擬機(jī)的性能監(jiān)控和故障診斷工具。第7章詳細(xì)介紹了對Java堆的分析方法和案例。第8章介紹了Java虛擬機(jī)對多線程,尤其是對鎖的支持。第9~10章介紹了Java虛擬機(jī)的核心—Class文件結(jié)構(gòu),以及Java虛擬機(jī)中類的裝載系統(tǒng)。第11章介紹了Java虛擬機(jī)的執(zhí)行系統(tǒng)和字節(jié)碼,并給出了通過ASM框架進(jìn)行字節(jié)碼注入的案例。本書不僅適合Java程序員閱讀,還適合工作于Java虛擬機(jī)之上的研發(fā)人員、軟件設(shè)計師、架構(gòu)師閱讀。
目錄(285章)
倒序
- 封面
- 版權(quán)信息
- 前言
- 第1章 初探Java虛擬機(jī)
- 1.1 知根知底:追溯Java的發(fā)展歷程
- 1.1.1 那些依托Java虛擬機(jī)的語言大咖們
- 1.1.2 Java發(fā)展史上的里程碑
- 1.2 跨平臺的真相:Java虛擬機(jī)做中介
- 1.2.1 理解Java虛擬機(jī)的原理
- 1.2.2 看清Java虛擬機(jī)的種類
- 1.3 一切看我的:Java語言規(guī)范
- 1.3.1 詞法的定義
- 1.3.2 語法的定義
- 1.3.3 數(shù)據(jù)類型的定義
- 1.3.4 Java語言規(guī)范總結(jié)
- 1.4 一切聽我的:Java虛擬機(jī)規(guī)范
- 1.5 數(shù)字編碼就是計算機(jī)世界的水和電
- 1.5.1 整數(shù)在Java虛擬機(jī)中的表示
- 1.5.2 浮點數(shù)在Java虛擬機(jī)中的表示
- 1.6 拋磚引玉:編譯和調(diào)試虛擬機(jī)
- 1.7 小結(jié)
- 第2章 認(rèn)識Java虛擬機(jī)的基本結(jié)構(gòu)
- 2.1 謀全局者才能成大器:看穿Java虛擬機(jī)的架構(gòu)
- 2.2 小參數(shù)能解決大問題:學(xué)會設(shè)置Java虛擬機(jī)的參數(shù)
- 2.3 對象去哪兒:辨清Java堆
- 2.4 函數(shù)如何調(diào)用:出入Java棧
- 2.4.1 局部變量表
- 2.4.2 操作數(shù)棧
- 2.4.3 幀數(shù)據(jù)區(qū)
- 2.4.4 棧上分配
- 2.5 類去哪兒了:識別方法區(qū)
- 2.6 小結(jié)
- 第3章 常用Java虛擬機(jī)參數(shù)
- 3.1 一切運(yùn)行都有跡可循:掌握跟蹤調(diào)試參數(shù)
- 3.1.1 跟蹤垃圾回收—讀懂虛擬機(jī)日志
- 3.1.2 類加載/卸載的跟蹤
- 3.1.3 查看系統(tǒng)參數(shù)
- 3.2 讓性能飛起來:學(xué)習(xí)堆的配置參數(shù)
- 3.2.1 最大堆和初始堆的設(shè)置
- 3.2.2 新生代的配置
- 3.2.3 堆溢出處理
- 3.3 別讓性能有缺口:了解非堆內(nèi)存的參數(shù)配置
- 3.3.1 方法區(qū)配置
- 3.3.2 棧配置
- 3.3.3 直接內(nèi)存配置
- 3.4 Client和Server二選一:虛擬機(jī)的工作模式
- 3.5 小結(jié)
- 第4章 垃圾回收的概念與算法
- 4.1 內(nèi)存管理清潔工:認(rèn)識垃圾回收
- 4.2 清潔工具大PK:討論常用的垃圾回收算法
- 4.2.1 引用計數(shù)法(Reference Counting)
- 4.2.2 標(biāo)記清除法(Mark-Sweep)
- 4.2.3 復(fù)制算法(Copying)
- 4.2.4 標(biāo)記壓縮法(Mark-Compact)
- 4.2.5 分代算法(Generational Collecting)
- 4.2.6 分區(qū)算法(Region)
- 4.3 誰才是真正的垃圾:判斷可觸及性
- 4.3.1 對象的復(fù)活
- 4.3.2 引用和可觸及性的強(qiáng)度
- 4.3.3 軟引用—可被回收的引用
- 4.3.4 弱引用—發(fā)現(xiàn)即回收
- 4.3.5 虛引用—對象回收跟蹤
- 4.4 垃圾回收時的停頓現(xiàn)象:Stop-The-World案例實戰(zhàn)
- 4.5 小結(jié)
- 第5章 垃圾收集器和內(nèi)存分配
- 5.1 一心一意一件事:串行回收器
- 5.1.1 新生代串行回收器
- 5.1.2 老年代串行回收器
- 5.2 人多力量大:并行回收器
- 5.2.1 新生代ParNew回收器
- 5.2.2 新生代ParallelGC回收器
- 5.2.3 老年代ParallelOldGC回收器
- 5.3 一心多用都不落下:CMS回收器(JDK 8及之前的版本)
- 5.3.1 CMS主要工作步驟
- 5.3.2 CMS主要的參數(shù)
- 5.3.3 CMS的日志分析
- 5.3.4 有關(guān)Class的回收
- 5.4 未來我做主:G1回收器(JDK 9及之后版本的默認(rèn)回收器)
- 5.4.1 G1的內(nèi)存劃分和主要收集過程
- 5.4.2 G1的新生代GC
- 5.4.3 G1的并發(fā)標(biāo)記周期
- 5.4.4 混合回收
- 5.4.5 必要時的Full GC
- 5.4.6 G1的日志
- 5.4.7 G1相關(guān)的參數(shù)
- 5.5 回眸:有關(guān)對象內(nèi)存分配和回收的一些細(xì)節(jié)問題
- 5.5.1 禁用System.gc()
- 5.5.2 System.gc()使用并發(fā)回收
- 5.5.3 并行GC前額外觸發(fā)的新生代GC
- 5.5.4 對象何時進(jìn)入老年代
- 5.5.5 在TLAB上分配對象
- 5.5.6 finalize()函數(shù)對垃圾回收的影響
- 5.6 溫故又知新:常用的GC參數(shù)
- 5.7 動手才是真英雄:垃圾回收器對Tomcat性能影響的實驗
- 5.7.1 配置實驗環(huán)境
- 5.7.2 配置性能測試工具JMeter
- 5.7.3 配置Web應(yīng)用服務(wù)器Tomcat
- 5.7.4 實戰(zhàn)案例1—初試串行回收器
- 5.7.5 實戰(zhàn)案例2—擴(kuò)大堆以提升系統(tǒng)性能
- 5.7.6 實戰(zhàn)案例3—調(diào)整初始堆大小
- 5.7.7 實戰(zhàn)案例4—使用ParrellOldGC回收器
- 5.7.8 實戰(zhàn)案例5—使用較小堆提高GC壓力
- 5.7.9 實戰(zhàn)案例6—測試ParallelOldGC的表現(xiàn)
- 5.7.10 實戰(zhàn)案例7—測試ParNew回收器的表現(xiàn)
- 5.7.11 實戰(zhàn)案例8—測試JDK 1.8的表現(xiàn)
- 5.7.12 實戰(zhàn)案例9—使用高版本虛擬機(jī)提升性能
- 5.8 小結(jié)
- 第6章 性能監(jiān)控工具
- 6.1 有我更高效:Linux下的性能監(jiān)控工具
- 6.1.1 顯示系統(tǒng)整體資源使用情況—top命令
- 6.1.2 監(jiān)控內(nèi)存和CPU—vmstat命令
- 6.1.3 監(jiān)控I/O—iostat命令
- 6.1.4 多功能診斷器—pidstat工具
- 6.2 用我更高效:Windows下的性能監(jiān)控工具
- 6.2.1 任務(wù)管理器
- 6.2.2 perfmon性能監(jiān)控工具
- 6.2.3 ProcessExplorer進(jìn)程管理工具
- 6.2.4 pslist命令—Windows下也有命令行工具
- 6.3 外科手術(shù)刀:JDK性能監(jiān)控工具
- 6.3.1 查看Java進(jìn)程—jps命令
- 6.3.2 查看虛擬機(jī)運(yùn)行時信息—jstat命令
- 6.3.3 查看虛擬機(jī)參數(shù)—jinfo命令
- 6.3.4 導(dǎo)出堆到文件—jmap命令
- 6.3.5 JDK自帶的堆分析工具—jhat命令
- 6.3.6 查看線程堆棧—jstack命令
- 6.3.7 遠(yuǎn)程主機(jī)信息收集—jstatd命令
- 6.3.8 多功能命令行—jcmd命令
- 6.3.9 性能統(tǒng)計工具—hprof
- 6.3.10 擴(kuò)展jps命令
- 6.4 我是你的眼:圖形化虛擬機(jī)監(jiān)控工具JConsole
- 6.4.1 JConsole連接Java程序
- 6.4.2 Java程序概況
- 6.4.3 內(nèi)存監(jiān)控
- 6.4.4 線程監(jiān)控
- 6.4.5 類加載情況
- 6.4.6 虛擬機(jī)信息
- 6.5 一目了然:可視化性能監(jiān)控工具Visual VM
- 6.5.1 Visual VM連接應(yīng)用程序
- 6.5.2 監(jiān)控應(yīng)用程序概況
- 6.5.3 Thread Dump和分析
- 6.5.4 性能分析
- 6.5.5 內(nèi)存快照分析
- 6.5.6 BTrace介紹
- 6.6 來自JRockit的禮物:虛擬機(jī)診斷工具M(jìn)ission Control
- 6.6.1 MBean服務(wù)器
- 6.6.2 飛行記錄器(Flight Recorder)
- 6.7 小結(jié)
- 第7章 分析Java堆
- 7.1 對癥才能下藥:找到內(nèi)存溢出的原因
- 7.1.1 堆溢出
- 7.1.2 直接內(nèi)存溢出
- 7.1.3 過多線程導(dǎo)致OOM
- 7.1.4 永久區(qū)溢出
- 7.1.5 GC效率低下引起的OOM
- 7.2 無處不在的字符串:String在虛擬機(jī)中的實現(xiàn)
- 7.2.1 String對象的特點
- 7.2.2 有關(guān)String的內(nèi)存泄漏
- 7.2.3 有關(guān)String常量池的位置
- 7.3 虛擬機(jī)也有內(nèi)窺鏡:使用MAT分析Java堆
- 7.3.1 初識MAT
- 7.3.2 淺堆和深堆
- 7.3.3 MAT堆分析案例解析
- 7.3.4 支配樹(Dominator Tree)
- 7.3.5 Tomcat堆溢出分析
- 7.4 篩選堆對象:MAT對OQL的支持
- 7.4.1 Select子句
- 7.4.2 From子句
- 7.4.3 Where子句
- 7.4.4 內(nèi)置對象與方法
- 7.5 更精彩的查找:Visual VM對OQL的支持
- 7.5.1 Visual VM的OQL基本語法
- 7.5.2 內(nèi)置heap對象
- 7.5.3 對象函數(shù)
- 7.5.4 集合/統(tǒng)計函數(shù)
- 7.5.5 程序化OQL分析Tomcat堆
- 7.6 小結(jié)
- 第8章 鎖與并發(fā)
- 8.1 安全就是鎖存在的理由:鎖的基本概念和實現(xiàn)
- 8.1.1 理解線程安全
- 8.1.2 對象頭和鎖
- 8.2 避免殘酷的競爭:鎖在Java虛擬機(jī)中的實現(xiàn)和優(yōu)化
- 8.2.1 偏向鎖
- 8.2.2 輕量級鎖
- 8.2.3 鎖膨脹
- 8.2.4 自旋鎖
- 8.2.5 鎖消除
- 8.3 應(yīng)對殘酷的競爭:鎖在應(yīng)用層的優(yōu)化思路
- 8.3.1 減少鎖持有時間
- 8.3.2 減小鎖粒度
- 8.3.3 鎖分離
- 8.3.4 鎖粗化
- 8.4 無招勝有招:無鎖
- 8.4.1 理解CAS
- 8.4.2 原子操作
- 8.4.3 新寵兒LongAdder
- 8.5 將隨機(jī)變?yōu)榭煽兀豪斫釰ava內(nèi)存模型
- 8.5.1 原子性
- 8.5.2 有序性
- 8.5.3 可見性
- 8.5.4 Happens-Before原則
- 8.6 小結(jié)
- 第9章 Class文件結(jié)構(gòu)
- 9.1 不僅跨平臺,還能跨語言:語言無關(guān)性
- 9.2 虛擬機(jī)的基石:Class文件
- 9.2.1 Class文件的標(biāo)志—魔數(shù)
- 9.2.2 Class文件的版本
- 9.2.3 存放所有常數(shù)—常量池
- 9.2.4 Class的訪問標(biāo)記(Access Flag)
- 9.2.5 當(dāng)前類、父類和接口
- 9.2.6 Class文件的字段
- 9.2.7 Class文件的方法基本結(jié)構(gòu)
- 9.2.8 方法的執(zhí)行主體—Code屬性
- 9.2.9 記錄行號—LineNumberTable屬性
- 9.2.10 保存局部變量和參數(shù)—LocalVariableTable屬性
- 9.2.11 加快字節(jié)碼校驗—StackMapTable屬性
- 9.2.12 Code屬性總結(jié)
- 9.2.13 拋出異常—Exceptions屬性
- 9.2.14 用實例分析Class的方法結(jié)構(gòu)
- 9.2.15 我來自哪里—SourceFile屬性
- 9.2.16 強(qiáng)大的動態(tài)調(diào)用—BootstrapMethods屬性
- 9.2.17 內(nèi)部類—InnerClasses屬性
- 9.2.18 將要廢棄的通知—Deprecated屬性
- 9.2.19 Class文件總結(jié)
- 9.3 操作字節(jié)碼:走進(jìn)ASM
- 9.3.1 ASM體系結(jié)構(gòu)
- 9.3.2 ASM之Hello World
- 9.4 小結(jié)
- 第10章 Class裝載系統(tǒng)
- 10.1 來去都有序:看懂Class文件的裝載流程
- 10.1.1 類裝載的條件
- 10.1.2 加載類
- 10.1.3 驗證類
- 10.1.4 準(zhǔn)備
- 10.1.5 解析類
- 10.1.6 初始化
- 10.2 一切Class從這里開始:掌握ClassLoader
- 10.2.1 認(rèn)識ClassLoader,看懂類加載
- 10.2.2 ClassLoader的分類
- 10.2.3 ClassLoader的雙親委托模式
- 10.2.4 雙親委托模式的弊端
- 10.2.5 雙親委托模式的補(bǔ)充
- 10.2.6 突破雙親模式
- 10.2.7 熱替換的實現(xiàn)
- 10.3 小結(jié)
- 第11章 字節(jié)碼執(zhí)行
- 11.1 代碼如何執(zhí)行:字節(jié)碼執(zhí)行案例
- 11.2 執(zhí)行的基礎(chǔ):Java虛擬機(jī)常用指令介紹
- 11.2.1 常量入棧指令
- 11.2.2 局部變量壓棧指令
- 11.2.3 出棧裝入局部變量表指令
- 11.2.4 通用型操作
- 11.2.5 類型轉(zhuǎn)換指令
- 11.2.6 運(yùn)算指令
- 11.2.7 對象操作指令
- 11.2.8 比較控制指令
- 11.2.9 函數(shù)調(diào)用與返回指令
- 11.2.10 同步控制
- 11.2.11 再看Class的方法結(jié)構(gòu)
- 11.3 更上一層樓:再看ASM
- 11.3.1 為類增加安全控制
- 11.3.2 統(tǒng)計函數(shù)執(zhí)行時間
- 11.4 誰說Java太刻板:Java Agent運(yùn)行時修改類
- 11.4.1 使用-javaagent參數(shù)啟動Java虛擬機(jī)
- 11.4.2 使用Java Agent為函數(shù)增加計時功能
- 11.4.3 動態(tài)重轉(zhuǎn)換類
- 11.4.4 有關(guān)Java Agent的總結(jié)
- 11.5 與時俱進(jìn):動態(tài)方法調(diào)用
- 11.5.1 方法句柄使用實例
- 11.5.2 調(diào)用點使用實例
- 11.5.3 反射和方法句柄
- 11.5.4 指令invokedynamic使用實例
- 11.6 跑得再快點:靜態(tài)編譯優(yōu)化
- 11.6.1 編譯時計算
- 11.6.2 變量字符串的連接
- 11.6.3 基于常量的條件語句裁剪
- 11.6.4 switch語句的優(yōu)化
- 11.7 提高虛擬機(jī)的執(zhí)行效率:JIT及其相關(guān)參數(shù)
- 11.7.1 開啟JIT編譯
- 11.7.2 JIT編譯閾值
- 11.7.3 多級編譯器
- 11.7.4 OSR棧上替換
- 11.7.5 方法內(nèi)聯(lián)
- 11.7.6 設(shè)置代碼緩存大小
- 11.8 小結(jié)
- 反侵權(quán)盜版聲明 更新時間:2024-01-08 16:12:45
推薦閱讀
- Java Web程序開發(fā)范例寶典
- MacTalk 跨越邊界
- DevSecOps企業(yè)級實踐:理念、技術(shù)與案例
- Android深度探索(卷1):HAL與驅(qū)動開發(fā)
- 軟件秘笈:設(shè)計模式那點事
- BERT基礎(chǔ)教程:Transformer大模型實戰(zhàn)
- Spring Cloud微服務(wù)快速上手
- TensorFlow+Android經(jīng)典模型從理論到實戰(zhàn)(微課視頻版)
- MATLAB函數(shù)速查手冊(修訂版)
- Spring Boot趣味實戰(zhàn)課
- C#從入門到精通(第2版)
- Spring 3.0就這么簡單
- 架構(gòu)現(xiàn)代化:方法與實踐
- 軟件開發(fā)技術(shù)
- 安卓Frida逆向與協(xié)議分析
- 軟件性能測試、分析與調(diào)優(yōu)實踐之路(第2版)
- 軟件開發(fā)者路線圖—從學(xué)徒到高手
- DevOps落地與轉(zhuǎn)型:提升研發(fā)效能的方法與實踐
- 有效需求分析(第2版)
- Java常用算法手冊(第3版)
- 不敢止步:一個軟件工匠的12年
- Haskell函數(shù)式編程入門
- Vue.js+Node.js全棧開發(fā)實戰(zhàn)(第2版)
- 中文版 UG NX 8.0 技術(shù)大全
- SRE原理與實踐:構(gòu)建高可靠性互聯(lián)網(wǎng)應(yīng)用
- Scrum精髓:敏捷轉(zhuǎn)型指南
- 軟件快速交付方法論
- 機(jī)械電氣控制與PLC
- Android開發(fā)實戰(zhàn):從學(xué)習(xí)到產(chǎn)品
- 善用佳軟:高效能人士的軟件應(yīng)用之道