簡體   English   中英

C#中的每線程內存管理

[英]Per-thread memory management in C#

繼續從了解VS2010 C#並行分析結果的討論,但更重要的是:

我有許多並行工作的線程(使用Parallel.For / Each),它們為小類使用許多內存分配。

這會在全局內存分配器線程上產生爭用。

有沒有辦法指示.NET為每個線程預分配內存池並從該池中進行所有分配?

目前我的解決方案是我自己的內存池實現(全局分配的類型為T的對象數組,它們在線程中循環使用)這有很大幫助,但效率不高,因為:

  1. 我不能指示.NET從特定的內存片分配。
  2. 我仍然需要多次調用new來為池分配內存。

謝謝,

我搜索了兩天試圖找到你遇到的同一問題的答案。 答案是您需要將垃圾收集模式設置為服務器模式。 默認情況下,垃圾收集模式設置為Workstation模式。 將垃圾收集設置為服務器模式會導致托管堆拆分為單獨管理的部分,每個CPU一個。 為此,您需要在app.config文件中添加配置設置。

<runtime>
   <gcServer enabled="true"/>
</runtime>

我的12核Opteron 6172的速度差異非常大!

垃圾收集器不分配內存。

這聽起來更像是你分配了許多小的臨時對象和一些長壽命的對象,垃圾收集器花了很多時間垃圾收集臨時對象,所以你的應用程序不需要從中請求更多的內存OS。 .NET Framework 4高級開發 - 垃圾收集

只要托管堆中的地址空間可用,運行時就會繼續為新對象分配空間。 但是,記憶並不是無限的。 最終垃圾收集器必須執行一個集合才能釋放一些內存。

解決方案: 不要分配大量的小臨時對象。 關於垃圾收集和性能的頁面也可能有所幫助。

您可以預先分配一堆對象,並將它們保存在用於單獨線程的組中。 但是,你可能不會從中獲得更好的表現。

垃圾收集器專門用於有效處理小型短壽命對象。 如果將對象保留在池中,它們將是長期存在的並且將在垃圾收集中存活,這反過來意味着它們將被復制到第二代堆。 這種復制比分配新對象更昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM