2012-06-13 106 views

回答

3

.NET運行庫需要所有的內存操作的照顧。沒有辦法來覆蓋內存分配器,因爲這樣做會大大改變GC的運行方式,特別是考慮到它的壓縮。因爲內存池已經被CLR「託管」,並且分配新的對象不會被「分配」,所以在.NET中,這種可能會在.NET中提供更少的好處,因爲在.NET世界中對象分配要便宜得多。不一定會觸發新的內存(通常它只是清除和使用已分配的內存)。

2

SmartHeap聲稱成名,我從15年前就記住它,它可以避免爭用堆鎖。託管程序的堆與原生程序使用的堆沒有太大共同之處,像SmartHeap這樣的產品肯定不會有任何用處。

但它確實具有相同類型的鎖定。它不像在本機代碼中那樣多,堆垃圾收集堆的堆分配非常快,它只是一個指針增量。本地堆分配器必須做更多的工作以避免碎片化。所以兩個或多個託管線程在正好分配的可能性並不是那麼好。儘管如此,由於完全不同的原因,.NET CLR does支持多堆。該功能在服務器版本的Windows上自動啓用。您可以通過在app.exe.config文件中使用<gcServer> element來有意強制它。副作用是鎖爭用將會非常低,真正的意圖是同時在多個線程上收集垃圾。

你可以打開它,看看它是否有任何明顯的差異。請注意,它確實會消耗更多內存,並且垃圾收集暫停可能會在交互式UI類型的程序中引起注意。後臺集合不可用於服務器GC,它將變爲可用於.NET 4.5

相關問題