.NET 中 GC 的模式與風格

来源:https://www.cnblogs.com/kklldog/archive/2022/05/10/net-gc-modes.html
-Advertisement-
Play Games

垃圾回收(GC)是托管語言必備的技術之一。GC 的性能是影響托管語言性能的關鍵。我們的 .NET 既能寫桌面程式 (WINFROM , WPF) 又能寫 web 程式 (ASP.NET CORE),甚至還能寫移動端程式。。。不同使用場景的程式對 GC 的風格也有不同的要求,比如桌面程式更註重界面的響 ...


垃圾回收(GC)是托管語言必備的技術之一。GC 的性能是影響托管語言性能的關鍵。我們的 .NET 既能寫桌面程式 (WINFROM , WPF) 又能寫 web 程式 (ASP.NET CORE),甚至還能寫移動端程式。。。不同使用場景的程式對 GC 的風格也有不同的要求,比如桌面程式更註重界面的響應速度,web 程式註重的是吞吐量。有幸的是 CLR 為我們提供了2種不同的 GC 模式與風格。

Workstation GC

工作站模式被設計為客戶端(桌面)程式使用,或者某些只有1個核心的機器使用。工作站模式下 GC 的回收頻次會加快,但是每一次 GC 造成的停頓很短暫。工作站模式的垃圾回收直接發生在觸發垃圾回收的用戶線程上。所以垃圾回收線程需要跟其他用戶線程去競爭 CPU 時間。工作站模式下只會分配一個 GC 堆,在工作站模式下 GC 分配的記憶體會更少。

Server GC

伺服器模式適合大型的服務端應用,比如 ASP.NET Core 程式。伺服器模式下 GC 的回收會儘量的延遲,從而減少停頓。為了獲得更高的吞吐量與性能,程式會分配更多的記憶體。伺服器模式下 CLR 根據 CPU 核心數量來分配 GC 堆的數量。同時為每個 GC 堆分配一個專用線程來執行回收,並且這個線程的優先順序為 THREAD_PRIORITY_HIGHEST ,所以在與普通線程競爭的時候更容易獲得 CPU 時間。伺服器模式通常具有更大容量的記憶體分段。分段容量的大小不是固定的,它跟 OS,邏輯 CPU 數量有關係:

設置使用 workstation 或者 server 模式

根據微軟的文檔上寫的客戶端單機程式預設的GC模式是 workstation ,ASP.NET 的 GC 模式取決於主機。如果不清楚預設的 GC 工作模式可以直接指定模式。
在不同的 .NET 版本下有不同的設置方式,參見下圖:

我們上面說的 workstation 模式跟 server 模式是 GC 的兩個主要模式。而 GC 在這兩個模式之下還有兩個不同的子風格 Non-Concurrent 跟 Background (concurrent) 風格。

Non-Concurrent

根據 CLR 之前的設計,如果 GC 線程啟動那麼所有其他的線程都會掛起。

回收 0代、1代這種短代(ephemeral generations)速度是非常快,但是回收2代垃圾對象就相對比較慢。如果線程一直掛起會對程式的響應造成比較大的影響。於是 CLR 設計了 background(concurrent) GC 。 background GC 使用專用線程來回收2代對象,並且回收的時候不會掛起其他線程。

Background

在 background(concurrent) GC 回收執行的時候,0,1代的回收可以同步進行。background(concurrent) GC 使用一個或者多個專用線程來執行回收動作。
在 .NET Framework 4 之前稱之為 concurrent GC ,之後稱之為 background GC 。在 .NET Framework 4 時代,background GC 只支持在 workstation GC 模式下開啟。從 .NET Framework 4.5 開始 background GC 同時支持 workstation , server 模式。以下不再區分 background 跟 concurrent GC,統一使用 background 來描述。
background GC 運行的時候並不會掛起其他線程,但是反過來如果 1,2 代的 GC 正在運行那麼會掛起其他所有的線程,包括 background 專用線程。

background GC 在 workstation 跟 server 模式下有一些區別:

in workstation mode

在 workstation 模式下 background GC 使用一個專用線程。

通過上圖我們可以看到:THREAD 1 發生 GC 的時候 其他線程包括 background GC 線程都會暫停。而 GC THREAD (background)啟動的時候則不會掛起其他線程,而且 GC THREAD 線程只有一個 。

in server mode

在 server 模式下 background GC 會使用多個專用線程。線程的數量取決於邏輯處理器的數量。與在 workstation 模式下不同,server 模式下的 background GC 線程不會超時。

上圖中 GC THREAD1、2 代表 FGC 線程,它執行的時候會掛起其他所有的線程包括 BGC 線程。圖中的 BGC THREAD1、2 代表專用 background GC 線程。可以看到它執行的時候不會掛起其他線程,而且線程的數量並不是唯一的。

開啟關閉 background GC

根據微軟的文檔說明,在 Server 模式下,background 是預設的 GC 風格。也可以直接通過配置開啟 background GC 。
在不同的 .NET 版本下有不同的配置方式,參見下圖:

總結

通過以上我們對 GC 的 workstation / server 模式,以及 no-concurrent 跟 background GC 風格有了一定的瞭解。總結一下:如果你的程式是個客戶端程式需要 UI 更快的響應,希望 GC 造成的用戶線程暫停時間更短那麼選用 workstation 模式。如果你的電腦只有一個處理器那麼也選擇 workstation 模式。如果你的程式是大型 web 服務,你希望儘可能的利用伺服器 CPU 與記憶體從而獲得更大的吞吐量與性能,那麼選用 server 模式。在 server 模式下我們也應該儘量使用 background GC 。因為它可以更加充分的利用的多核處理器的優勢來進行 GC 操作。

參考

workstation-server-gc
wbackground-gc
fundamentals-gc
CLR 的 GC 工作模式介紹
understanding-different-gc-modes-with-concurrency-visualizer

關註我的公眾號一起玩轉技術

QQ群:1022985150 VX:kklldog 一起探討學習.NET技術
作者:Agile.Zhou(kklldog)
出處:http://www.cnblogs.com/kklldog/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天突發奇想想來玩一玩,然後安裝了一下午才成功,基本所有該踩的坑都踩了,但當時沒截圖,現在靠著記憶寫一下。 官網鏈接:https://www.mongodb.com/try/download/community。 需要註意的是:超過次數就必須要登錄才能下載。(證明我真的試過很多次) 1.最開始出現的 ...
  • 今天某個項目的數據有些問題,需要查詢日誌看看具體的情況 結果在執行 cat ***.log |grep "關鍵字" 命令後包如下錯誤: grep: memory exhausted 思路1: 既然提示 記憶體問題,是不是日誌文件太大了, 用 du -sh * 命令查看 後文件也就 300M 思路2: ...
  • 下載&安裝Cmake 進入下載頁面 Download | CMake 選擇安裝包版本 打開安裝包,下一步之後選擇添加path 選擇完安裝文件夾開始安裝 下載&配置OpenCV 進入下載頁面 Releases - OpenCV 選擇版本下載(我下的是 Sources,Windows版是已經構建好的,不 ...
  • 多線程筆記(二) 1. Synchronized 和 Lock 的區別 synchronized是Java的關鍵字,是 JVM 層面的內置功能和實現。 Lock是一個介面,是代碼層面的實現 synchronized可以隱式的獲取,釋放鎖 lock是顯式的獲取,釋放鎖 synchronized在發生異 ...
  • 來源:編碼磚家 鏈接:cnblogs.com/xiaoyangjia/p/11267191.html 背景 最近頻繁出現慢SQL告警,執行時間最長的竟然高達5分鐘。導出日誌後分析,主要原因竟然是沒有命中索引和沒有分頁處理 。 其實這是非常低級的錯誤,我不禁後背一涼,團隊成員的技術水平亟待提高啊。改造 ...
  • 實現一個雷達掃描圖。 源代碼在TK_King/雷達 (gitee.com),自行下載就好了 製作思路 繪製圓形(或者稱之輪) 繪製分割線 繪製掃描範圍 添加掃描點 具體實現 首先我們使用自定義的控制項。你可以使用vs自動添加,也可以手動創建類。註意手動創建時要創建Themes/Generic.xaml ...
  • ODT文檔格式一種開放文檔格式(OpenDocument Text)。通常,ODT格式的文件可以使用LibreOffice Writer、MS Word或其他一些文檔編輯器來打開。我們在處理文檔時,可通過格式轉換的方式,將ODT轉為其他格式,或者將其他格式轉為ODT,來獲取目標文檔。本文,以C#及V ...
  • 背景: 先上個圖,看一下效果: SSO英文全稱Single Sign On(單點登錄)。SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用於同一個用戶的登錄的機制。 它是目前比較流行的企業業務整合的解決方案之一。(本段內容來自百 ...
一周排行
    -Advertisement-
    Play Games
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...