有没有人写过或知道用C#编写的自定义内存管理器?

时间:2009-08-17 12:09:04

标签: c# .net memory-management

我们有一些用C#编写的应用程序,我们希望它保持这种状态。该应用程序操纵许多小而短暂的动态内存块。它似乎也对GC中断很敏感。

我们认为减少GC的一种方法是分配100K块,然后使用自定义内存管理器从它们分配内存。有人在C#中遇到过自定义内存管理器实现吗?

5 个答案:

答案 0 :(得分:8)

也许您应该考虑使用某种池化架构,在这种架构中,您预先预先分配了许多项目,然后从池中租用它们。这样可以很好地固定内存需求。 MSDN上有一些可以作为参考的实现:

http://msdn2.microsoft.com/en-us/library/bb517542.aspx

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.socketasynceventargs.aspx

...或者如果需要,我可以提供我的通用实现。

答案 1 :(得分:4)

来自System.Object的所有类型的内存管理由垃圾收集器执行(除了存储在堆栈中的结构/基元之外)。在Microsoft的CLR实现中,垃圾收集器无法替换。

您可以在不安全的块内手动分配堆上的一些原语,然后通过指针访问它们,但不建议这样做。

可能,您应该相应地分析和迁移类到结构。

答案 2 :(得分:3)

显而易见的选择是使用Marshal.AllocHGlobalMarshal.FreeHGlobal。我还有一份DougLeaAllocatordlmalloc)的副本,用C#编写并经过实战考验。如果你愿意,我可以把它告诉你。无论哪种方式都需要谨慎,一致地使用IDisposable

答案 3 :(得分:1)

在垃圾收集中收集项目的唯一时间是 没有更多参考 到对象。

您应该创建一个静态类或其他东西,以便在应用程序的生命周期内保留对象的生命周期引用。

如果你想管理自己的内存,可以在C#中使用unsafe,但你最好选择一种不像C ++那样管理的语言。

答案 4 :(得分:0)

虽然我没有使用它的经验,但您可以尝试编写C#非托管代码。 或者,您可以通过调用

告诉GC不要收集您的对象
GC.KeepAlive(obj);