Java性能權威指南(第2版) Java Performance: In-Depth Advice for Tuning and Programming Java 8, 11, and Beyond 2/e

Scott Oaks

  • Java性能權威指南(第2版)-preview-1
  • Java性能權威指南(第2版)-preview-2
Java性能權威指南(第2版)-preview-1

商品描述

本書從JVM和Java API兩個方面,深入地介紹了Java 8和Java 11等新的Java長期支持版本中影響性能的因素。本書先從Java應用程序的通用方法、基準測試的缺陷、性能監控工具等方面,分析瞭如何通過JVM的配置方式影響程序的性能;接著從即時編譯、垃圾回收、堆內存與原生內存最佳實踐、線程與同步的性能等方面,分析了常見的優化方向及其特性。第2版專註於更加成熟的Java 8和Java 11,主要的更新內容涉及G1垃圾回收器和Java飛行記錄器,以及Java在容器化環境下的性能變化。

作者簡介

【作者简介】

 

斯科特·奥克斯(Scott Oaks)

 

Oracle公司架构师,从事Oracle云平台软件的性能优化工作。在加入Oracle之前,他是Sun公司的Java布道师,并在2001年加入Java性能工程小组,专注于Java的性能优化工作。除了本书,他还著有多部涉及Java线程、Java安全等方面的著作。

 

【译者简介】

 

党文亮

 

沉浸Java相关领域多年,目前在华为云专注于性能诊断平台和OS管理系统的研发,有大量从0到1的项目实践经验,在逆向、性能、算法等方面都有一定的积累。

目錄大綱

前言 xiii

第 1章 導論 1

1.1 概述 2

1.2 平臺和約定 2

1.2.1 Java平臺 2

1.2.2 硬件平臺 4

1.3 全面的性能 6

1.3.1 寫出更好的算法 6

1.3.2 寫更少的代碼 7

1.3.3 過早優化 8

1.3.4 其他:數據庫永遠是瓶頸 9

1.3.5 常見優化 9

1.4 小結 10

第 2章 性能測試方法 11

2.1 測試真實的應用程序 11

2.1.1 微基準測試 11

2.1.2 宏基準測試 15

2.1.3 介基準測試 16

2.2 理解吞吐量、批處理時間和響應時間 17

2.2.1 測量批處理時間17

2.2.2 測量吞吐量18

2.2.3 測量響應時間 19

2.3 理解可變性22

2.4 早測試、常測試 25

2.5 基準測試示例 27

2.5.1 Java 微基準測試工具 27

2.5.2 常用代碼示例 34

2.6 小結 36

第3 章 Java 性能工具箱 38

3.1 操作系統工具和分析 38

3.1.1 CPU 使用率 39

3.1.2 CPU 運行隊列 41

3.1.3 磁盤使用率 42

3.1.4 網絡使用率 44

3.2 Java 監控工具 45

3.2.1 基本的VM 信息 46

3.2.2 線程信息 48

3.2.3 類信息 49

3.2.4 實時GC 分析 49

3.2.5 堆轉儲後期處理 49

3.3 性能分析工具 49

3.3.1 採樣分析器 50

3.3.2 探查分析器 53

3.3.3 阻塞方法和線程時間線 54

3.3.4 原生分析器 55

3.4 JFR 57

3.4.1 Java Mission Control 57

3.4.2 JFR 概覽 58

3.4.3 開啟JFR 64

3.4.4 選擇JFR 事件 67

3.5 小結 69

第4 章 使用即時編譯器 70

4.1 即時編譯器:概覽 70

4.2 分層編譯 73

4.3 常用的編譯器標志 74

4.3.1 優化代碼緩存 74

4.3.2 檢查編譯過程 75

4.3.3 分層編譯級別 78

4.3.4 逆優化 79

4.4 高級編譯器標志 82

4.4.1 編譯閾值 82

4.4.2 編譯線程 83

4.4.3 內聯 85

4.4.4 逃逸分析 86

4.4.5 CPU 相關代碼 87

4.5 分層編譯的權衡 88

4.6 GraalVM 89

4.7 預編譯 90

4.7.1 提前編譯 90

4.7.2 GraalVM 原生編譯 92

4.8 小結 93

第5 章 垃圾回收簡介 95

5.1 垃圾回收概覽 95

5.1.1 分代垃圾回收器97

5.1.2 GC 算法99

5.1.3 選擇GC 算法101

5.2 GC 優化基礎108

5.2.1 調整堆的大小 108

5.2.2 調整分代大小 110

5.2.3 調整元空間大小 112

5.2.4 控制並行113

5.3 GC 工具114

5.3.1 在JDK 8 中開啟GC 日誌 114

5.3.2 在JDK 11 中開啟GC 日誌 115

5.4 小結 118

第6 章 垃圾回收算法 119

6.1 理解Throughput 回收器 119

6.2 理解G1 垃圾回收器 125

6.3 理解CMS 回收器 136

6.4 高級優化 143

6.4.1 晉升和Survivor 空間143

6.4.2 分配大對象 146

6.4.3 AggressiveHeap 標志 152

6.4.4 完全掌控堆的大小 153

6.5 實驗性GC 算法 154

6.5.1 並發壓縮:ZGC 和Shenandoah 154

6.5.2 無回收:Epsilon GC 156

6.6 小結157

第7 章 堆內存最佳實踐 159

7.1 堆分析 159

7.1.1 堆直方圖160

7.1.2 堆轉儲161

7.1.3 內存溢出錯誤 164

7.2 減少內存使用 168

7.2.1 減小對象大小 169

7.2.2 使用延遲初始化171

7.2.3 使用不可變對象和標準化對象 175

7.3 對象生命周期管理 176

7.3.1 對象重用177

7.3.2 軟引用、弱引用和其他引用181

7.3.3 壓縮的普通對象指針193

7.4 小結194

第8 章 原生內存最佳實踐195

8.1 內存占用195

8.1.1 測量內存占用 196

8.1.2 最小化內存占用197

8.1.3 原生內存跟蹤 197

8.1.4 共享庫原生內存201

8.2 針對操作系統的JVM 優化 204

8.3 小結208

第9 章 線程和同步性能 209

9.1 線程和硬件209

9.2 線程池和ThreadPoolExecutor 210

9.2.1 設置最大線程數210

9.2.2 設置最小線程數213

9.2.3 線程池任務大小215

9.2.4 設置ThreadPoolExecutor 的大小215

9.3 ForkJoinPool.217

9.3.1 工作竊取 221

9.3.2 自動並行化 223

9.4 線程同步 224

9.4.1 同步的代價 225

9.4.2 避免同步 228

9.4.3 偽共享 230

9.5 JVM 線程優化 233

9.5.1 優化線程棧大小 234

9.5.2 偏向鎖234

9.5.3 線程優先級 235

9.6 監控線程和鎖 235

9.6.1 查看線程235

9.6.2 查看阻塞線程 236

9.7 小結239

第 10 章 Java 服務器 240

10.1 Java NIO 概覽 240

10.2 服務器容器 242

10.2.1 優化服務器線程池 242

10.2.2 異步Rest 服務器 243

10.3 異步出站調用246

10.4 JSON 處理251

10.4.1 解析和編組概覽 252

10.4.2 JSON 對象 253

10.4.3 JSON 解析 254

10.5 小結 256

第 11 章 數據庫性能最佳實踐 257

11.1 示例數據庫 258

11.2 JDBC 258

11.2.1 JDBC 驅動 258

11.2.2 JDBC 連接池 260

11.2.3 預處理語句和語句池 261

11.2.4 事務 262

11.2.5 結果集處理269

11.3 JPA270

11.3.1 優化JPA 寫 271

11.3.2 優化JPA 讀 272

11.3.3 JPA 緩存 275

11.4 Spring Data280

11.5 小結281

第 12 章 Java SE API 技巧282

12.1 字符串 282

12.1.1 壓縮字符串 282

12.1.2 重復字符串和字符串保留283

12.1.3 字符串連接 288

12.2 緩沖I/O 291

12.3 類加載 293

12.4 隨機數 296

12.5 Java 原生接口298

12.6 異常300

12.7 日誌303

12.8 Java 集合API304

12.8.1 同步和異步305

12.8.2 設置集合大小306

12.8.3 集合與內存效率 307

12.9 Lambda 和匿名類 308

12.10 流和過濾器的性能310

12.11 對象序列化 312

12.11.1 瞬時字段312

12.11.2 覆蓋默認的序列化313

12.11.3 壓縮序列化數據 315

12.11.4 跟蹤重復對象317

12.12 小結 319

附錄 調優標志總結 321