溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Core 配置對GC工作模式與內(nèi)存的影響是什么

發(fā)布時間:2021-12-15 18:34:02 來源:億速云 閱讀:152 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關.NET Core 配置對GC工作模式與內(nèi)存的影響是什么,文章內(nèi)容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

引出問題: Asp.net core應用在 Kubernetes上內(nèi)存使用率過高問題分析

在默認情況下,ASP.NET Core程序跑在K8s的Docker中內(nèi)存使用率>=600MB,導致Docker容器頻繁重啟。并探討并做了將ASP.NET Core項目配置System.GC.Server設置為False后,內(nèi)存小于<=150MB的實驗。

主要講下什么是System.GC.Server,還有GC的二種模式。

對GC工作模式的分類:   .NET Core 兩種GC模式:

    
  
  
  

Copy

Server GC / Workstation GC

Server GC :

主要應用于多處理器系統(tǒng),并且作為ASP.NET Core宿主的默認配置。它會為每個處理器都創(chuàng)建一個GC Heap,并且會并行執(zhí)行回收操作。該模式的GC可以最大化吞吐量和較好的收縮性。這種模式的特點是初始分配的內(nèi)存較大,并且盡可能不回收內(nèi)存,進行回收用時會很耗時,并進行內(nèi)存碎片整理工作。

Workstation GC :

主要應用于單處理器系統(tǒng),Workstation GC盡可能地通過減少垃圾回收過程中程序的暫停次數(shù)來提高性能。低負載且不常在后臺(如服務)執(zhí)行任務的應用程序,可以在禁用并發(fā)垃圾回收的情況下使用工作站垃圾回收。特點是會頻繁回收,來阻止一次較長時間的回收。

Concurrent GC 工作方式 :

是一種GC的工作方式,如果你是單處理器的機器,那么即便配置了Concurrent選項為True,也不會生效。Server GC 和Workstation GC都可以開啟Concurrent GC,在GC回收的過程中大部分時間用戶線程可以并發(fā)運行。但只能影響到2代對象GC的過程,因為0代1代的時間太短了。

ASP.NET Core Project GC配置:

ASP.NET CORE項目中,通過System.GC.Server配置進行GC模式設置,創(chuàng)建項目默認的GC模式是: System.GC.Server : true (Server GC Concurrent Mode) 每CPU分配GC ;System.GC.Server : false (Workstation GC Concurrent mode),且Concurrent=1。

GC 內(nèi)存分配原則:

GC heap用于保存0、1、2代的對象時,需要向系統(tǒng)申請時的基本單位是Segment,系統(tǒng)會分配指定值大小的Segment用于存儲對象,這些值會隨著程序的實際執(zhí)行情況,由GC動態(tài)調整。正是由于有Segment的概念所以回出現(xiàn)內(nèi)存碎片的問題,所以GC在垃圾回收過程中會進行內(nèi)存整理,以減少內(nèi)存碎片提高內(nèi)存使用率。

Segment的大小取決于系統(tǒng)是32位還是64位,以及它正在運行的垃圾收集器的類型,下表列出了分配時系統(tǒng)所使用的默認值:

GC Model32-bit64-bit
Workstation GC16 MB256 MB
Server GC64 MB4 GB
Server GC with > 4 logical CPUs32 MB2 GB
Server GC with > 8 logical CPUs16 MB1 GB

Segment包括第2代對象,第2代對象會在內(nèi)存允許的情況盡可能多的申請到內(nèi)存,并使用多個段進行內(nèi)存存儲。
從GC中釋放的內(nèi)存量僅限于Segment的大小,但由于Segment采用動態(tài)大小進行了分配,這就使得釋放后的大量內(nèi)存占位導致內(nèi)存使用率低下,前面也說過了,為了解決這個問題GC要對內(nèi)存碎片進行整理,并中斷所有線程的處理。

.NET Core GC的幾種配置模式:

Concurrent & Workstation GC

    
  
  
  

Copy

<ServerGarbageCollection>false</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特點:在吞吐量和相應速度上尋找平衡點, GC Heap數(shù)量為1,GC threads在分配空間的線程,GC線程優(yōu)先權和工作線程具有相同的優(yōu)先權,工作線程(非GC線程)會因為GC工作過程中短暫多次掛起。

Background & Workstation GC

    
  
  
  

Copy

<ServerGarbageCollection>false</ServerGarbageCollection>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特點:最大化吞吐量并優(yōu)化gen2 GC性能, GC Heap數(shù)量為1,background GC線程與工作線程有相同優(yōu)先級,但都低于前臺GC線程 ,工作線程(非GC線程)會因為GC工作過程中短暫多次掛起,較并發(fā)性能更加(針對Gen2的)。

Concurrent & Server GC

    
  
  
  

Copy

<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特點:多處理器機器上使用多線程處理相同類型的請求以便最大化服務程序吞吐量, GC Heap數(shù)量為每處理器1個,每個處理器都有一個專職的GC線程,GC線程擁有最高線程的優(yōu)先級,工作線程(非GC線程)會因為GC工作過程中會被掛起。

Background & Server GC

    
  
  
  

Copy

<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特點:在Concurrent & Server GC基礎上優(yōu)化gen2 GC性能, GC Heap數(shù)量為每處理器1個,每個處理器都有一個專職的GC background線程,background GC線程與工作線程有相同優(yōu)先級,但都低于前臺GC線程,工作線程(非GC線程)會因為GC工作過程中短暫多次掛起,較并發(fā)性能更加(針對Gen2的)
ephemeral generation的前臺GC工作時會掛起其他所有線程。

關于.NET Core 配置對GC工作模式與內(nèi)存的影響是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

gc
AI