什么是“同步块”以及减少计数的提示

我们有一个使用(第三方)ActiveX控件的Windows窗体应用程序,并且在“.NET CLR内存”下的.NET性能对象中注意到正在使用的“同步块”的数量不断增加(以及增加的内存)用法),即使我们的应用程序闲置在那里。

接收器块计数的内置说明:

此计数器显示当前使用的同步块数。 同步块是分配用于存储同步信息的每对象数据结构。 同步块包含对托管对象的弱引用,需要由垃圾收集器进行扫描。 同步块不限于存储同步信息,还可以存储COM互操作元数据。 此计数器旨在指示大量使用同步原语的性能问题。

当我们切换到不同的应用程序时,同步块计数似乎确实会重置。 究竟是什么导致了这些创建,是否有减少这些数量的提示?

(顺便说一句,它确实在性能计数器列表中拼写为“sink block”。我不确定它是否是一个错字或管道笑话)

每次在.NET平台中使用锁定原语(例如lockMonitor.Enter时,都会针对要锁定的对象实例初始化同步块结构。 如定义中所述,这些块可以包含更多信息,例如对象的哈希码和COM互操作信息。

由于这些块受限于可以存储的内容,因此同时访问这些块会引起争用,这反过来导致对象头的内容成为CLR管理的系统范围同步块表的索引。 当对象需要时,CLR能够回收这些同步块。

在等待系统内核对象之前,锁定对象始终会导致CPU旋转。 每当分配的CPU旋转不满足以允许监视器获取临界区锁时,将创建系统自动重置事件句柄,并将对其的引用放入相关的同步块中。 等待此事件句柄的其他线程将阻塞事件句柄,直到拥有的线程触发事件句柄的释放。

因此,如果此计数器不断增加,则表明有太multithreading争用锁定一个或多个对象,并且这些锁可能永远不会被释放。