簡體   English   中英

什么導致.NET中的內存碎片

[英]What causes memory fragmentation in .NET

我正在使用Red Gates ANTS內存分析器來調試內存泄漏。 它一直警告我:

內存碎片可能導致.NET保留過多的可用內存。

要么

內存碎片正在影響可以分配的最大對象的大小

因為我有強迫症,所以必須解決這個問題。

有哪些標准編碼實踐有助於避免內存碎片。 你能通過一些.NET方法對它進行碎片整理嗎? 它會幫助嗎?

GC堆以不同方式處理大對象分配。 它不會壓縮它們,而只是組合相鄰的空閑塊(就像傳統的非托管內存存儲區)。

更多信息: http//msdn.microsoft.com/en-us/magazine/cc534993.aspx

因此,使用非常大的對象的最佳策略是分配它們一次然后保持它們並重用它們。

你知道,我有點懷疑這里的內存分析器。 .NET中的內存管理系統實際上是通過在內存中移動來嘗試對堆進行碎片整理(這就是為什么需要固定內存以便與外部DLL共享)。

在較長時間內進行的大量內存分配容易產生更多碎片。 雖然小的短暫(短)內存請求不太可能導致.NET碎片化。

這也是值得思考的事情。 使用.NET的當前GC,及時分配的內存通常在空間中間隔很近。 這與碎片相反。 即您應該按照打算訪問它的方式分配內存。

它只是托管代碼還是包含P / Invoke,非托管內存(Marshal.AllocHGlobal)或GCHandle.Alloc(obj,GCHandleType.Pinned)等內容?

.NET Framework 4.5.1能夠在垃圾回收期間顯式壓縮大對象堆(LOH)。

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

請在GCSettings.LargeObjectHeapCompactionMode中查看更多信息

暫無
暫無

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

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