ASP .net core之Memory usage

Asp .net core內存管理機制

注意:在垃圾回收觸發時,除了觸發垃圾回收的線程外全部的其餘線程都會掛起狀態安全

分類:

主要分爲server GC workstation GC服務器

Server GC

默認值多線程

用於多核系統,它爲每一個處理器建立一個GC Heap,並進行併發執行會後操做(在.net framework4.5以前,concurrent這個是默認的,在以後用backgroud替代了)。併發

特色:初始分配內存大(每一個cpu都要分配,它佔用內存多),同時該模式認爲內存就是用的,不佔用就有浪費的行爲,同時頻繁GC會形成系統資源的浪費,因此,基本上它是有多少內存佔用多少內存。ide

使用場景:服務器上應用少,吃內存的應用性能

Workstation GC:

workstation GC 發生在觸發在用戶線程上,用戶線程一般是以普通優先級運行,因此該模式下垃圾回收器必須與其餘線程競爭CPU時間,固然他不會掛起運行本機代碼的線程,可是會引起其餘線程的hang住。spa

它能夠是併發模式,也能夠禁用併發模式。.net

使用場景:服務器上應用多,同時須要禁用併發垃圾回收。緣由:減小cpu上下文切換,提升機器性能。線程

這裏提一下後臺workstation GC

後臺workstation GC :後臺工做垃圾回收期間對01代的回收稱爲前臺垃圾回收,前臺垃圾回收時,全部託管線程都將被掛起。server

         當後臺垃圾回收正在進行而且你已在第 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