Объекты, выделенные на кучу

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

В чем именно заключается использование этих двух полей. Может ли кто-нибудь пролить свет на это?

Ответ 1

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

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

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

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

Ответ 3

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

Ответ 4

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