是否有任何类似于 SmartHeap 的解决方案,用于优化内存操作,用于托管 C# 代码 (.net)?
2 回答
.NET 运行时负责所有内存操作。没有办法覆盖内存分配器,因为这样做会极大地改变 GC 的运行方式,尤其是考虑到它的压缩。
话虽如此,这可能在 .NET 中提供的好处要少得多,因为在 .NET 世界中对象分配要便宜得多,因为内存池已经由 CLR“管理”,并且分配新对象不一定会触发新对象内存(通常它只是清除和使用已分配的内存)。
SmartHeap 的名气,我当然记得 15 年前的事,就是它可以避免争用堆锁。托管程序的堆与本机程序使用的堆没有太多共同之处,像 SmartHeap 这样的产品肯定不会有任何用处。
但它确实有相同类型的锁。它不像本地代码那样严重,垃圾收集堆的堆分配非常快,它只是一个指针增量。本机堆分配器必须做更多的工作以避免碎片。因此,两个或多个托管线程同时分配的可能性并不大。
然而,出于完全不同的原因,.NET CLR确实支持多个堆。该功能在 Windows 的服务器版本上自动启用。您可以通过使用app.exe.config 文件中的<gcServer>
元素来有意强制启用它。一个副作用是锁竞争非常低,真正的目的是同时在多个线程上收集垃圾。
您可以打开它,看看它是否有任何明显的不同。请注意,它确实会消耗更多内存,并且垃圾收集暂停在交互式 UI 类型的程序中可能很明显。后台收集不适用于服务器 GC,它将在.NET 4.5中可用