舉報

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