我们有一些用C#编写的应用程序,我们希望它保持这种状态。该应用程序操纵许多小而短暂的动态内存块。它似乎也对GC中断很敏感。
我们认为减少GC的一种方法是分配100K块,然后使用自定义内存管理器从它们分配内存。有人在C#中遇到过自定义内存管理器实现吗?
答案 0 :(得分:8)
也许您应该考虑使用某种池化架构,在这种架构中,您预先预先分配了许多项目,然后从池中租用它们。这样可以很好地固定内存需求。 MSDN上有一些可以作为参考的实现:
http://msdn2.microsoft.com/en-us/library/bb517542.aspx
...或者如果需要,我可以提供我的通用实现。
答案 1 :(得分:4)
来自System.Object
的所有类型的内存管理由垃圾收集器执行(除了存储在堆栈中的结构/基元之外)。在Microsoft的CLR实现中,垃圾收集器无法替换。
您可以在不安全的块内手动分配堆上的一些原语,然后通过指针访问它们,但不建议这样做。
可能,您应该相应地分析和迁移类到结构。
答案 2 :(得分:3)
显而易见的选择是使用Marshal.AllocHGlobal
和Marshal.FreeHGlobal
。我还有一份DougLeaAllocator
(dlmalloc
)的副本,用C#编写并经过实战考验。如果你愿意,我可以把它告诉你。无论哪种方式都需要谨慎,一致地使用IDisposable
。
答案 3 :(得分:1)
在垃圾收集中收集项目的唯一时间是 没有更多参考 到对象。
您应该创建一个静态类或其他东西,以便在应用程序的生命周期内保留对象的生命周期引用。
如果你想管理自己的内存,可以在C#中使用unsafe,但你最好选择一种不像C ++那样管理的语言。
答案 4 :(得分:0)
虽然我没有使用它的经验,但您可以尝试编写C#非托管代码。 或者,您可以通过调用
告诉GC不要收集您的对象GC.KeepAlive(obj);