2009-11-26 44 views
13

我們有一個使用(第三方)ActiveX控件的Windows窗體應用程序,並在「.NET CLR內存」下的.NET性能對象中注意到即使我們的應用程序處於空閒狀態,正在使用的「同步塊」數量也在不斷增加(隨着內存使用量的增加)。什麼是「同步塊」和減少計數的提示

信宿塊計數狀態內置的解釋:

此計數器顯示在使用中的同步塊的當前數目。同步塊是分配用於存儲同步信息的每個對象的數據結構。同步塊對被管對象持有弱引用,需要由垃圾收集器掃描。同步塊不限於存儲同步信息,還可以存儲COM互操作元數據。此計數器旨在指示大量使用同步基元的性能問題。

但是,當我們切換到不同的應用程序時,同步塊計數看起來會重置。究竟是什麼導致這些創建,並有任何提示減少這些?

(順便說一句,這真的是在性能計數器列表中拼寫爲「散熱塊。」我不知道,如果它的一個錯字或管道笑話)您使用鎖定原語如lock

+0

更好地稱它們爲同步塊,當然在標題中。 – 2009-11-26 12:07:49

回答

19

每次在.NET平臺中,對於要鎖定的對象實例,初始化同步塊結構。如定義中所述,這些塊可以容納更多信息,例如對象的散列碼和COM互操作信息。

由於這些塊的存儲空間有限,因此同時訪問塊會導致爭用,從而導致對象頭的內容成爲CLR管理的系統範圍同步塊表的索引。當物件需要它們時,CLR能夠回收這些同步塊。

在等待系統內核對象之前,鎖定對象始終導致CPU旋轉。只要分配的CPU旋轉不滿足允許監視器獲取關鍵部分鎖定,系統自動重置事件句柄將被創建並且其引用將被放入關聯的同步塊中。等待此事件句柄的其他線程將阻塞事件句柄,直到擁有的線程觸發事件句柄的釋放。

因此,如果此計數器不斷增加,這是一個跡象表明,太多線程爭用一個或多個對象的鎖,並且這些鎖可能永遠無法釋放。

+0

也可能與提到調用GetHashCode()也初始化同步塊有關。 – 2017-06-08 06:15:22

+0

@VincePanuccio我相信這是一個.NET 1.1的東西? (也就是說CLR今天會這樣做嗎?) – user2864740 2017-12-24 02:52:59