我最近对.NET 4垃圾回收器进行了基准测试,从多个线程进行大量分配。当分配的值记录在数组中时,我观察到没有可扩展性,这正如我所预期的那样(因为系统争用同步访问共享老年代)。然而,当分配的值立即被丢弃时,我感到十分震惊,因为我观察到此时也没有可扩展性!
我原本预计暂时情况下将近线性扩展,因为每个线程应该只需清空nursery gen0并开始新的分配,而不需要争用任何共享资源(没有东西存活到更老的代中,也没有L2缓存缺失,因为gen0轻松适应L1缓存)。
例如,这篇MSDN文章说:
无需同步的分配 在多处理器系统上,托管堆的第0代使用一个内存区域来划分多个内存单元,每个线程使用一个内存单元。这允许多个线程同时进行分配,因此不需要对堆进行互斥访问。
有人能够验证我的发现并/或解释我预测和观察之间的差异吗?