2009-10-27 11 views
11

Po utworzeniu dowolnego nowego obiektu obiekt jest tworzony na stercie. Pamięć przydzielona dla każdego obiektu ma dwa dodatkowe pola 1) Wskaźnik obiektu typu 2) wskaźnik bloku synchronizacji.Obiekty przydzielone do sterty

Czym dokładnie jest użycie tych dwóch pól. Czy ktoś może rzucić na to światło?

+0

Biorąc pod uwagę, że wszystkie obiekty są określonego typu, howelse powinno być znane, chyba że zapisuje gdzieś typ ...? Nie martw się o czytanie tego typu rzeczy, martw się o swój kod. –

+0

@mP Dokładnie - dlaczego więc nie rejestruje tych informacji dla typów wartości? Zawsze warto wiedzieć, jak działają twoje narzędzia. – TarkaDaal

Odpowiedz

17

Wskaźnik obiektu typu służy do oznaczenia typu obiektu. Jest to wymagane dla:

  • Lookup Method (vtable)
  • Sprawdzanie rzuca
  • Znalezienie obiektu Type jeśli zadzwonisz GetType.

Pole synchronizacji służy przede wszystkim do blokowania. Jest wypełniany tylko wtedy, gdy jest potrzebny, a gdy zamek jest zawsze niekwestionowany, CLR wykonuje "cienką" blokadę, która nie wymaga żadnych zewnętrznych danych. W przeciwnym razie jest to wpis w tabeli dotyczącej całego procesu - nie znam szczegółów tego, co jest w tabeli, ale wyobrażam sobie, że to rzeczy takie jak lista wątków oczekujących na monitorze obiektu. Oczywiście najważniejszą informacją jest to, czy zamek jest aktualnie w posiadaniu, przez który wątek i jaki jest jego numer (z powodu ponownego charakteru blokad .NET).

Syncblock jest również wypełniany, jeśli wywołujesz GetHashCode() i nie jest on nadpisywany - w zasadzie wykorzystuje tabelę całego procesu do przydzielenia liczby stabilnej. (Adres obiektu nie jest wystarczająco dobry, ponieważ może się zmieniać z upływem czasu.)

+0

Nie wiedziałem, że o GetHashCode i synchronizatorze ... masz więcej informacji na ten temat? Znalazłem ten http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx ale wydaje się być .NET 1.0/1.1 tylko ... – thecoop

+1

@thecoop: Nie mam żadnych inne odniesienia do strony, chociaż spodziewałbym się, że będzie to wspomniane w CLR przez C#. –

+0

Wydaje mi się, że synchronizacja jest również używana do przechowywania metadanych COM interop i AppDomainID (jako @JonSkeet powiedział, jest to wpis w "_process-wide_ table.") – Sindhudweep

2

Indeks bloku synchronizacji jest używany pod maską przez klasę Monitor, a tym samym także instrukcję blokowania.

1

Niektóre bity indeksu bloku synchronizacji są również używane przez GC do oznaczania obiektów jako śmieci w przypadku, gdy nie są już przywoływane.

Powiązane problemy