推薦序 xi
前言 xii
第1章 導論 1
1.1 概述 2
1.2 平臺版本約定 2
1.3 全面的性能調優(yōu) 4
1.3.1 編寫更好的算法 4
1.3.2 編寫更少的代碼 4
1.3.3 老調重彈的過早優(yōu)化 5
1.3.4 其他:數據庫很可能就是瓶頸 6
1.3.5 常見的優(yōu)化 7
1.4 小結 8
第2章 性能測試方法 9
2.1 原則1:測試真實應用 9
2.1.1 微基準測試 9
2.1.2 宏基準測試 13
2.1.3 介基準測試 15
2.1.4 代碼示例 16
2.2 原則2:理解批處理流逝時間、吞吐量和響應時間 19
2.2.1 批處理流逝時間 19
2.2.2 吞吐量測試 20
2.2.3 響應時間測試 20
2.3 原則3:用統(tǒng)計方法應對性能的變化 23
2.4 原則4:盡早頻繁測試 26
2.5 小結 28
第3章 Java性能調優(yōu)工具箱 29
3.1 操作系統(tǒng)的工具和分析 29
3.1.1 CPU使用率 29
3.1.2 CPU運行隊列 32
3.1.3 磁盤使用率 33
3.1.4 網絡使用率 34
3.2 Java監(jiān)控工具 35
3.2.1 基本的VM信息 36
3.2.2 線程信息 39
3.2.3 類信息 39
3.2.4 實時GC分析 39
3.2.5 事后堆轉儲 39
3.3 性能分析工具 39
3.3.1 采樣分析器 40
3.3.2 探查分析器 41
3.3.3 阻塞方法和線程時間線 42
3.3.4 本地分析器 44
3.4 Java任務控制 45
3.4.1 Java飛行記錄器 46
3.4.2 開啟JFR 52
3.4.3 選擇JFR事件 54
3.5 小結 56
第4章 JIT編譯器 58
4.1 JIT 編譯器:概覽 58
4.2 調優(yōu)入門:選擇編譯器類型(Client、Server 或二者同用) 61
4.2.1 優(yōu)化啟動 62
4.2.2 優(yōu)化批處理 63
4.2.3 優(yōu)化長時間運行的應用 64
4.3 Java和JIT編譯器版本 64
4.4 編譯器中級調優(yōu) 67
4.4.1 調優(yōu)代碼緩存 67
4.4.2 編譯閾值 68
4.4.3 檢測編譯過程 70
4.5 高級編譯器調優(yōu) 73
4.5.1 編譯線程 73
4.5.2 內聯 74
4.5.3 逃逸分析 75
4.6 逆優(yōu)化 76
4.6.1 代碼被丟棄 77
4.6.2 逆優(yōu)化僵尸代碼 78
4.7 分層編譯級別 79
4.8 小結 80
第5章 垃圾收集入門 81
5.1 垃圾收集概述 81
5.1.1 分代垃圾收集器 83
5.1.2 GC算法 84
5.1.3 選擇GC算法 87
5.2 GC調優(yōu)基礎 92
5.2.1 調整堆的大小 92
5.2.2 代空間的調整 95
5.2.3 永久代和元空間的調整 96
5.2.4 控制并發(fā) 97
5.2.5 自適應調整 98
5.3 垃圾回收工具 99
5.4 小結 102
第6章 垃圾收集算法 103
6.1 理解Throughput收集器 103
6.2 理解CMS收集器 109
6.2.1 針對并發(fā)模式失效的調優(yōu) 113
6.2.2 CMS收集器的永久代調優(yōu) 116
6.2.3 增量式CMS垃圾收集 117
6.3 理解G1垃圾收集器 118
6.4 高級調優(yōu) 126
6.4.1 晉升及Survivor空間 126
6.4.2 分配大對象 129
6.4.3 AggressiveHeap標志 136
6.4.4 全盤掌控堆空間的大小 137
6.5 小結 138
第7章 堆內存最佳實踐 140
7.1 堆分析 140
7.1.1 堆直方圖 141
7.1.2 堆轉儲 142
7.1.3 內存溢出錯誤 146
7.2 減少內存使用 149
7.2.1 減少對象大小 149
7.2.2 延遲初始化 152
7.2.3 不可變對象和標準化對象 156
7.2.4 字符串的保留 157
7.3 對象生命周期管理 160
7.3.1 對象重用 160
7.3.2 弱引用、軟引用與其他引用 165
7.4 小結 175
第8章 原生內存最佳實踐 176
8.1 內存占用 176
8.1.1 測量內存占用 177
8.1.2 內存占用最小化 178