我们有一款用C#编写的应用程序,希望它保持原样。该应用程序操作许多小而短暂的动态内存块。同时,它似乎对GC中断很敏感。
我们认为减少GC的一种方法是分配100K的块,然后使用自定义内存管理器从中分配内存。有没有人在C#中遇到过自定义内存管理器实现?
我们认为减少GC的一种方法是分配100K的块,然后使用自定义内存管理器从中分配内存。有没有人在C#中遇到过自定义内存管理器实现?
也许你应该考虑使用某种池化架构,预先分配一些项目,然后从池中租借它们。这可以很好地控制内存需求。MSDN上有一些实现可以作为参考:
http://msdn2.microsoft.com/en-us/library/bb517542.aspx
如果需要,我可以提供我的通用实现。
System.Object
的类型的内存管理都由垃圾回收器执行(除了存储在堆栈上的结构/基元)。在微软CLR的实现中,垃圾回收器无法被替换。显然的选择是使用Marshal.AllocHGlobal
和Marshal.FreeHGlobal
。我还有一份在C#中编写并经过实战检验的DougLeaAllocator
(dlmalloc
)副本。如果您愿意,我可以把它拿出来给您。无论哪种方式都需要仔细、一致地使用IDisposable
。
垃圾回收只有在对象没有引用时才会收集项目。
您应该创建一个静态类或其他东西,以保持应用程序生命周期内的对象的生存期引用。
如果您想管理自己的内存,可以在C#中使用不安全代码,但最好选择像C++这样的非托管语言。
GC.KeepAlive(obj);