Объекты, размещенные в куче - PullRequest
11 голосов
/ 27 октября 2009

Всякий раз, когда создается новый объект, он создается в куче. Память, выделенная для каждого объекта, имеет два дополнительных поля: 1) указатель объекта типа; 2) индекс блока синхронизации.

Что такое использование этих двух полей. Кто-нибудь может пролить свет на это?

Ответы [ 4 ]

17 голосов
/ 27 октября 2009

Указатель объекта типа используется для представления типа объекта. Это требуется для:

  • Метод поиска (vtable)
  • Проверка приведений
  • Поиск объекта Type при вызове GetType.

Поле syncblock в основном используется для блокировки. Он заполняется только тогда, когда это необходимо, и когда блокировка всегда не оспаривается, CLR обходится «тонкой» блокировкой, которая не требует никаких внешних данных. В противном случае это запись в таблице всего процесса - я не знаю деталей того, что находится в таблице, но я бы предположил, что это такие вещи, как список потоков, ожидающих на мониторе объекта. Конечно, самая важная часть информации - это то, удерживается ли в данный момент блокировка, каким потоком и каково ее количество (из-за повторяющейся природы блокировок .NET).

Синхронный блок также заполняется, если вы вызываете GetHashCode(), и он не переопределяется - он использует таблицу всего процесса для выделения стабильного числа, в основном. (Адрес объекта недостаточно хорош, так как со временем может измениться.)

4 голосов
/ 27 октября 2009

Тип объекта - это то, что возвращается при вызове obj.GetType

блок синхронизации, используемый для синхронизации

См:

2 голосов
/ 27 октября 2009

Индекс блока синхронизации используется внутренним классом Monitor и, следовательно, оператором блокировки.

1 голос
/ 16 мая 2011

Некоторые биты индекса блока синхронизации также используются GC для пометки объекта как мусора в случае, если на него больше нет ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...