perfmon里的# GC Handles的值其实不可靠
刚才被它唬了一把,幸好后来意识到了.
在性能计数器里的.net clr memory下有个# gc handles计数器, 这个计数器的值相比其他的是比较特殊的. 关于gc的计数器,绝大多数都是在gc结束的时候值才改变,但是这个却不是这样的. 比如当我们通过托管代码去请求创建一个handle,这时候这个值就加1了. 但是出于性能的考虑.net对它没有interlocked这样机制,所以这个值可能会在多个线程的并发情况下发生改变. 所以这个值其实是不可靠的.
那么怎么找到一个可靠的值呢?用SOS吧,它提供的gchandles命令能够准确的返回你要的结果.原理很简单,它遍历handle table.