減少分配大對象
ASP.NET Core中,垃圾回收器會自動分配及回收內存。這意味着開發人員不需要關心內存是何時,如何釋放的,但清理內存需要占用CUP時間,因此開發人員應盡量減少在“熱代碼路徑”上分配對象。垃圾回收在處理大對象(>85KB)時,代價很大。大對象存儲在大對象堆中,需要一個Full GC (2代對象回收),不同於0代和1代對象,2代對象回收需要暫停程序執行,頻繁的收集和分配大對象會導致性能不穩定。
建議操作:
- 將頻繁使用的大對象緩存起來,以避免高代價的內存分配。
- 使用 ArrayPool<T>作為緩存池,存儲大集合。
- 不要在熱代碼路徑上分配大量,生命周期很短的大對象。
前面講到的很多問題都可以通過 PerfView,查看垃圾回收狀態(GC)進行診斷,檢測項包括:
- 垃圾回收暫停時間
- 垃圾回收占用的處理器百分比
- 0代,1代,2代回收各有多少
更多內容請查看 Garbage Collection and Performance.