Mar*_*ath 18 c# performance activex memory-management
我们有一个使用(第三方)ActiveX控件的Windows窗体应用程序,并且在".NET CLR内存"下的.NET性能对象中注意到正在使用的"同步块"的数量不断增加(以及增加的内存)用法),即使我们的应用程序闲置在那里.
接收器块计数的内置说明:
此计数器显示当前使用的同步块数.同步块是分配用于存储同步信息的每对象数据结构.同步块包含对托管对象的弱引用,需要由垃圾收集器进行扫描.同步块不限于存储同步信息,还可以存储COM互操作元数据.此计数器旨在指示大量使用同步原语的性能问题.
当我们切换到不同的应用程序时,同步块计数似乎确实会重置.究竟是什么导致这些创建,有没有减少这些数量的提示?
(顺便说一下,它在性能计数器列表中拼写为"sink block".我不确定它是不是一个错字或管道笑话)
Mik*_*e J 26
每当你使用锁定原语,例如lock或Monitor.Enter在.NET平台,一个同步块结构抵靠对象实例初始化为被锁定.如定义中所述,这些块可以包含更多信息,例如对象的哈希码和COM互操作信息.
由于这些块受限于可存储的内容,因此同时访问这些块会导致争用,这反过来导致对象头的内容成为CLR管理的系统范围同步块表的索引.当对象需要时,CLR能够回收这些同步块.
在等待系统内核对象之前,锁定对象始终会导致CPU旋转.每当分配的CPU旋转不满足以允许监视器获取临界区锁时,将创建系统自动重置事件句柄,并将对其的引用放入相关的同步块中.等待此事件句柄的其他线程将阻塞事件句柄,直到拥有的线程触发事件句柄的释放.
因此,如果此计数器不断增加,则表明有太多线程争用锁定一个或多个对象,并且这些锁可能永远不会被释放.