2009-11-26 9 views
13

Mamy aplikację Windows Forms, która wykorzystuje kontrolkę ActiveX (strony trzeciej) i zauważają w obiektach wydajności .NET w "pamięci CLR .NET", które liczba używanych bloków "Sync Blocks" stale rośnie (wraz ze wzrostem wykorzystania pamięci), mimo że nasza aplikacja jest bezczynna.Co to jest "blok synchronizacji" i wskazówki dotyczące zmniejszania liczby:

Wbudowany wyjaśnienie stanów liczby bloków umywalką:

Ten licznik wyświetla aktualną liczbę bloków synchronizacji w użyciu. Bloki synchronizacji są strukturami danych dla obiektów przydzielonymi do przechowywania informacji synchronizacyjnych. Bloki synchronizacji przechowują słabe odniesienia do zarządzanych obiektów i muszą zostać zeskanowane przez Garbage Collector. Bloki synchronizacji nie są ograniczone do przechowywania informacji synchronizacyjnych i mogą również przechowywać metadane międzyoperacyjne COM. Ten licznik został zaprojektowany w celu wskazania problemów z wydajnością przy intensywnym użyciu prymitywów synchronizacji.

Licznik bloków synchronizacji wydaje się resetowany po przełączeniu do innej aplikacji. Co dokładnie powoduje, że są one tworzone i czy istnieją jakieś wskazówki dotyczące zmniejszenia ich liczby?

(BTW, to naprawdę jest napisane „blok sink” na liście liczników wydajności. Nie jestem pewien, czy jest to literówka czy hydraulika żart)

+0

Lepiej dzwoń do bloków synchronizacji, na pewno w tytule. –

Odpowiedz

19

Everytime używasz blokowania prymitywny takie jak lock lub Monitor.Enter na platformie .NET struktura bloków synchronizacji jest inicjowana względem instancji obiektu, która ma zostać zablokowana. Jak podano w definicji, bloki te mogą pomieścić więcej informacji, takich jak kod skrótu obiektu i informacje o współdziałaniu COM.

Ponieważ bloki te są ograniczone w tym, co można zapisać, dostęp do bloków jednocześnie powoduje rywalizację, co z kolei powoduje, że zawartość nagłówka obiektu staje się indeksem w tabeli bloków synchronizacji dla całego systemu zarządzanych przez CLR. Środowisko CLR jest w stanie odtworzyć ten blok synchronizacji, gdy obiekt potrzebuje ich.

Blokowanie obiektu powoduje zawsze wirowanie procesora przed oczekiwaniem na obiekt jądra systemu. Za każdym razem, gdy przydzielony spin procesora nie jest usatysfakcjonowany, aby umożliwić monitorowi uzyskanie krytycznej blokady sekcji, zostanie utworzony uchwyt zdarzenia automatycznego resetowania, a odniesienie do niego zostanie umieszczone w powiązanym bloku synchronizacji. Pozostałe wątki oczekujące na ten uchwyt zdarzenia będą blokować uchwyt zdarzenia, dopóki wątek będący właścicielem nie wyzwoli zwolnienia uchwytu zdarzenia.

Dlatego też, jeśli licznik stale się zwiększa, jest to znak, że zbyt wiele wątków walczy o blokadę jednego lub więcej obiektów i te blokady mogą nigdy nie zostać zwolnione.

+0

Może być również istotne, aby wspomnieć, że wywoływanie funkcji GetHashCode() również inicjuje blok synchronizacji. –

+0

@VincePanuccio Wierzę, że to była sprawa .NET 1.1? (Tj. Czy CLR robi to dzisiaj?) – user2864740

Powiązane problemy