.NET 中 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 數量有關系:

babeb3d3c0e8a7945aa439f5463d8191.png

設置使用 workstation 或者 server 模式

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

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

Non-Concurrent

根據 CLR 之前的設計,如果 GC 線程啟動那么所有其他的線程都會掛起。
666339e8102c8f1d7f1d4614a7970f3f.png
回收 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 使用一個專用線程。b8b72bb0937fa70d1bc19f5234488e2c.png
通過上圖我們可以看到:THREAD 1 發生 GC 的時候 其他線程包括 background GC 線程都會暫停。而 GC THREAD (background)啟動的時候則不會掛起其他線程,而且 GC THREAD 線程只有一個 。

in server mode

在 server 模式下 background GC 會使用多個專用線程。線程的數量取決于邏輯處理器的數量。與在 workstation 模式下不同,server 模式下的 background GC 線程不會超時。
f571dbaf359c4d51ef1e519823085aa6.png
上圖中 GC THREAD1、2 代表 FGC 線程,它執行的時候會掛起其他所有的線程包括 BGC 線程。圖中的 BGC THREAD1、2 代表專用 background GC 線程。可以看到它執行的時候不會掛起其他線程,而且線程的數量并不是唯一的。

開啟關閉 background GC

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

總結

通過以上我們對 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

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

9d480db8183710e85ee7db670f45d09f.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(轉)java中的 | ^ 分別是什么?

|是按位或 ^是按位抑或 &是按位與比如有兩個數 int x 5;int y 11;System.out.println(x|y);System.out.println(x&y);System.out.println(x^y);結果是15, 1 ,14 過程 x5 (0101二進制) y11(1011二進制) x|y 1111 15 x&y 0001 1 x…

[python opencv 計算機視覺零基礎到實戰] 七、邏輯運算與應用

一、學習目標 了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計算機…

Android之如何判斷當前是阿拉伯布局的方法

1 問題 判斷當前是不是阿拉伯布局的方法 2 幾種判斷方法 @SuppressLint("NewApi")public static boolean isLayoutRtl(View view, Resources res) {if (res == null || view == null) return false;Locale curLocale = res.getConfiguration().locale;//如果當前語言…

【ArcGIS風暴】數字化實驗:數據采集與編輯完整操作流程

一.實驗平臺:ArcGIS 9.3 二.實驗目的:對甘肅省的十四個地級市進行圖像配準、數據采集。 三.實驗要求:掌握地理數據采集方法,圖像配準及坐標投影,選擇主要的點、線、面進行投影。 四.實驗數據:甘肅省統計數據,甘肅省行政區劃圖。 (一).影像配準 第一步:加載…

loadrunner java 參數化_LoadRunner 參數化詳解

LoadRunner,是一種預測系統行為和性能的負載測試工具。通過以模擬上千萬用戶實施并發負載及實時性能監測的方式來確認和查找問題,LoadRunner能夠對整個企業架構進行測試。通過使用 LoadRunner,企業能最大限度地縮短測試時間,優化性…

Android之實現RTL的ViewPager

1 問題 如何實現RTL的ViewPager,就是滑動方向和我們之前滑動的方向相反,比如一般,我們用ViewPager滑動4個圖片,依次順序是 1 2 3 4 ,我們在頁面1的時候,我們一般都是習慣向左滑動到2,現在需要實現手指向右滑動到2. 2 解決辦法 1)我們可以使用ViewPager2,這個是可以支…

Why Apache Spark is a Crossover Hit for Data Scientists [FWD]

Spark is a compelling multi-purpose platform for use cases that span investigative, as well as operational, analytics. Data science is a broad church. I am a data scientist — or so I’ve been told — but what I do is actually quite different from what oth…

Blazor University (21)使用 RenderFragments 模板化組件 —— 傳遞占位符

原文鏈接:https://blazor-university.com/templating-components-with-renderfragements/passing-placeholders-to-renderfragments/將占位符傳遞給 RenderFragments源代碼[1]說明:此頁面的靈感來自用戶 ?ister?agoo 的 Twitter 帖子。首先&#xff0c…

物聯網(車聯網)平臺架構方案

技術支持QQ:787728951、車載終端網關采用mina/nettyspring架構,獨立于其他應用,主要負責維護接入終端的tcp鏈接、上行以及下行消息的解碼、編碼、流量控制,黑白名單等安全控制,網關同時支持交通部JT/T808-2011、JT/T80…

[python opencv 計算機視覺零基礎到實戰] 八、ROI泛洪填充

一、學習目標 了解什么是ROI了解floodFill的使用方法 如有錯誤歡迎指出~ 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計…

【經典回放】JavaScript學習詳細干貨筆記之(二)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、JavaScript 數組 JavaScript數組的定義、使用都是非常簡單的,從a17.htm就可以知道,僅僅定義的話,就使用: var …

java string類api_java基礎—String類型常用api

1、字符串比較equalsequalsIgnoreCase 忽略大小寫做比較2、字符串拆分(切片)splitString a "lemon:python:Java";//split切片之后的結果是一個一維字符串類型數組String[] arr a.split(":");for(int i 0 ;i System.out.println(arr[i]);}3、字符串截取…

解決沖突

人生不如意之事十之八九,合并分支往往也不是一帆風順的。 準備新的feature1分支,繼續我們的新分支開發: $ git checkout -b feature1 Switched to a new branch feature1修改readme.txt最后一行,改為: Creating a new …

Android之java.lang.OutOfMemoryError: Failed to allocate a ** byte allocation with **free bytes and 2M

1 問題 glide加載圖片出現oom java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM 2 解決辦法 1) 簡單粗暴點的在AndroidManifest.xml添加如下,增大安卓虛擬機內存 android:largeHeap"…

HQL入門學習

2019獨角獸企業重金招聘Python工程師標準>>> package myHibernate; /** 測試簡單的HQL語句* 2010年4月9日 23:36:54* */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.uti…

Oracle精簡客戶端配置

2019獨角獸企業重金招聘Python工程師標準>>> 由于Oracle client體積很大。而且安裝后,基本上就用2個功能:TNS配置服務名和SQL*Plus。下面是一種小巧、快捷的Oracle客戶端配置方法: 1.下載Instant Client 下載地址: htt…

【經典回放】JavaScript學習詳細干貨筆記之(三)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、再次從var開始說起 var到底是什么? 在前面的所有介紹中, JavaScript的var變量說明、是非常令人迷惑的事情。 var中…

WinUI遷移到.NET MAUI個人體驗

遷移的初衷本人平時是做.net相關的工作,對于.net技術棧也有一些了解,自從新的.net能夠跨平臺之后,之前也有跨平臺的ui框架Xamarin,現在微軟推出了.NET MAUI這個說是 統一了開發體驗,而且都RC版本了,所以本人…

祝CSDN2021牛氣沖天祝我也撥云散霧

前言 2020年4月,我寫了一篇用turtle繪制《小清新風格的樹》,反響挺好。現在打算使用turtle修改一下繪制方式,因為線條的繪制太過考慮因素過多,如果使用方塊進行堆疊,繪制出來的形狀可以如馬賽克一樣,既符合…

Android之Only fullscreen opaque activities can request orientation

1 問題 使用透明的activity主題,并且固定了方向,在Android8.0手機上提示錯誤如下 Only fullscreen opaque activities can request orientation 2 解決辦法 簡單粗暴就是去在AndroidManifest.xml文件去掉當前activity配置的里面的橫豎屏方向設置 and…