Asp .net core內存管理機制
注意:在垃圾回收觸發時,除了觸發垃圾回收的線程外所有的其他線程都會掛起狀態
分類:
主要分爲server GC 和workstation GC
Server GC:
默認值
用於多核系統,它爲每個處理器創建一個GC Heap,並進行併發執行會後操作(在.net framework4.5之前,concurrent這個是默認的,在之後用backgroud替代了)。
特點:初始分配內存大(每個cpu都要分配,它佔用內存多),同時該模式認爲內存就是用的,不佔用就有浪費的行爲,同時頻繁GC會造成系統資源的浪費,所以,基本上它是有多少內存佔用多少內存。
使用場景:服務器上應用少,吃內存的應用
Workstation GC:
workstation GC 發生在觸發在用戶線程上,用戶線程通常是以普通優先級運行,所以該模式下垃圾回收器必須與其他線程競爭CPU時間,當然他不會掛起運行本機代碼的線程,但是會引發其他線程的hang住。
它可以是併發模式,也可以禁用併發模式。
使用場景:服務器上應用多,同時需要禁用併發垃圾回收。原因:減少cpu上下文切換,提高機器性能。
這裏提一下後臺workstation GC
後臺workstation GC :後臺工作垃圾回收期間對0和1代的回收稱爲前臺垃圾回收,前臺垃圾回收時,所有託管線程都將被掛起。
當後臺垃圾回收正在進行並且你已在第 0 代中分配了足夠的對象時,CLR 將執行第 0 代或第 1 代前臺垃圾回收。
專用的後臺垃圾回收線程將在常見的安全點上進行檢查以確定是否存在對前臺垃圾回收的請求。
如果存在,則後臺回收將掛起自身以便前臺垃圾回收可以發生。 在前臺垃圾回收完成之後,專用的後臺垃圾回收線程和用戶線程將繼續。
後臺server GC 後臺服務垃圾回收:這個是默認的模式,與後臺workstation GC功能類似。與workstation GC後臺工作垃圾回收區別:一個是多線程,一個是專用的後臺垃圾回收線程。
應用
Docker場景
請使用workstation GC模式,即將server GC設置爲false即可。
如果用server GC可能會出現容器一直頻繁重啓的問題(一直達到內存最大分配值)。
參考文檔:
https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals