.NET 內存管理寶典 (Pro .NET Memory Management: For Better Code, Performance, and Scalability)
內容描述
瞭解.NET內存管理的內部工作原理、陷阱和技術,以便有效地避免軟件中出現各種性能和可伸縮性問題。盡管.NET具有自動內存管理功能,但瞭解 .NET的內存管理工作原理以及如何最好地編寫與之高效交互的軟件方面仍有許多益處。《.NET內存管理寶典 提高代碼質量、性能和可擴展性》是你通過瞭解和處理 .NET 中的內存管理來編寫出更好軟件的全面指南。 《.NET內存管理寶典 提高代碼質量、性能和可擴展性》經過了 Microsoft 的 .NET 團隊全面審查,包含 了25 個有價值的故障排除方案,旨在幫助診斷具有挑戰性的內存問題。讀者還將受益於多個 .NET 內存管理”規則”,這些規則介紹了編寫內存感知代碼的方法以及避免常見的破壞性陷阱的方法。 本書內容 ● 瞭解自動內存管理的理論基礎 ● 深入研究.NET內存管理的各個方面,包括對垃圾回收(GC)實現的詳細介紹,這些知識如果自行摸索需要多年經驗才能獲得 ● 獲得如何將這些知識應用於實際軟件開發中的實用建議 ● 使用與 .NET 內存管理相關工具的實用知識來診斷各種與內存相關的問題 ● 探索高級內存管理的各個方面,包括使用Span和Memory類型
目錄大綱
目錄
第1章基本概念 1
1.1 內存相關術語 2
1.2 手動內存管理15
1.3 自動內存管理19
1.4 引用計數23
1.5 跟踪回收器(Tracking Collector ) 26
1.6 小歷史32
1.7 本章小結34
規則1 – 自學34
第2章底層內存管理37
2.1 硬件37
2.2 操作系統55
2.3 NUMA和CPU組70
2.4 本章小結71
規則2 – 避免隨機訪問,擁抱循序訪問71
規則3 – 提高空間和時間數據局部性72
規則4 – 不要放棄使用更高級技巧的可能性72
第3章內存測量73
3.1 儘早測量74
3.2 Windows環境81
3.3 Linux環境123
3.4 本章小結135
規則5 – 儘早測量GC 137
第4章.NET基礎知識139
4.1 .NET版本139
4.2 .NET內部原理141
4.3 程序集和應用程序域148
4.4 進程內存區域150
4.5 類型系統161
4.6 字符串173
4.7 裝箱與拆箱185
4.8 按引用傳遞188
4.9 類型數據局部性190
4.10 靜態數據193
4.11 本章小結197
規則6 – 測量你的程序197
規則7 – 不要假設內存洩漏不存在198
規則8 – 考慮使用結構198
規則9 – 考慮使用字符串暫存198
規則10 – 避免裝箱198
第5章內存分區201
5.1 分區策略201
5.2 按大小分區202
5.3 按生存期分區207
5.4 按物理分區224
5.5 本章小結241
規則11 – 監視代大小241
規則12 – 避免不必要的堆引用241
規則13 – 監視段使用情況242
第6章內存分配243
6.1 內存分配簡介243
6.2 bump pointer分配244
6.3 空閒列表分配250
6.4 創建新對象253
6.5 堆再平衡260
6.6 OutOfMemoryException異常262
場景6-1:OutOfMemoryException異常263
6.7 堆棧分配265
6.8 避免分配266
6.9 本章小結300
規則14 – 在性能攸關的地方,避免堆分配300
規則15 – 避免過多的LOH分配301
規則16 – 如果可行,在堆棧上分配301
第7章垃圾回收——簡介303
7.1 高層視圖303
7.2 GC過程的示例304
7.3 GC過程的步驟309
場景7-1:分析GC的使用情況309
7.4 分析GC 313
7.5 垃圾回收性能調優數據314
7.6 回收觸發器325
7.7 EE掛起334
場景7-4:分析GC掛起時間335
7.8 要判決的代336
場景7-5:被判決的代的分析338
7.9 本章小結339
第8章垃圾回收——標記階段341
8.1 對象的遍歷與標記341
8.2 局部變量根342
8.3 終結根357
8.4 GC內部根357
8.5 GC句柄根358
8.6 處理內存洩漏363
第9章垃圾回收——計劃階段371
9.1 小對象堆371
9.2 大對象堆389
9.3 壓縮的決策390
9.4 本章小結391
第10章垃圾回收——清除和壓縮393
10.1 清除階段393
10.2 壓縮階段394
10.3 本章小結404
規則17 – 觀察運行時掛起405
規則18 – 避免“中年危機” 406
規則19 – 避免老的代和LOH碎片化406
規則20 – 避免顯式GC 407
規則21 – 避免內存洩漏407
規則22 – 避免固定407
第11章GC風格409
11.1 模式概述409
11.2 模式配置411
11.3 GC停頓和開銷413
11.4 模式描述414
11.5 延遲模式426
11.6 選擇GC風格431
11.7 本章小結438
規則23 – 有意識地選擇GC模式439
規則24 – 記住延遲模式的相關知識439
第12章對像生存期441
12.1 對象與資源的生命週期441
12.2 終結442
12.3 Disposable對象463
12.4 安全句柄468
12.5 弱引用473
12.6 本章小結486
規則25 – 避免終結器486
規則26 – 首選顯式清理487
第13章其他主題489
13.1 依賴句柄489
13.2 線程局部存儲494
13.3 託管指針504
13.4 關於結構的更多知識526
13.5 對象/結構佈局533
13.6 非託管約束541
13.7 本章小結546
第14章高級技巧547
14.1 Span和Memory 547
14.2 Unsafe 568
14.3 面向數據設計573
14.4 未來特性585
14.5 本章小結595
第15章編程API 597
15.1 GC API 597
15.2 CLR Hosting 609
15.3 ClrMD 616
15.4 TraceEvent庫621
15.5 自定義GC 623
15.6 本章小結626
作者介紹
作者簡介
Konrad Kokosa是一位經驗豐富的軟件設計師和開發人員。
他對Microsoft公司的技術特別感興趣,同時對其他所有技術也充滿好奇。
Konrad從事編程工作已經有十多年,解決過.NET世界中的許多性能問題和架構難題,設計和提升過.NET應用程序的運行速度。
他是一名獨立顧問,是meetup和技術會議講師,喜歡寫Twitter。
Konrad還分享了他作為.NET領域培訓講師的激情歲月,特別是在應用程序性能、編碼優秀實踐和診斷方面。
他是華沙Web性能小組的創始人。他是Visual Studio和開發工具類別中的Microsoft MVP。
他是Dotnetos.org的聯合創始人。
Dotnetos.org由三位.NET愛好者發起,主要組織.NET性能相關的會議。
譯者簡介
葉偉民
《.NET並發編程實戰》的譯者。曾在美國舊金山工作,具有16年的.NET開發經驗,目前從業於金融科技行業。
塗曙光
前微軟技術專家,專注於.NET和JavaScript技術領域。目前在私募基金行業從事低延遲交易系統的開發。