2009-11-26 3 views
13

У нас есть приложение Windows Forms, которое использует элемент управления ActiveX (стороннего производителя) и замечает в объектах производительности .NET в разделе «.NET CLR Memory», что количество используемых «Sync Blocks» постоянно увеличивается (наряду с увеличением использования памяти), хотя наше приложение сидит там без дела.Что такое «Блок синхронизации» и советы по сокращению числа

Встроенный объяснение раковины блок подсчета состояний:

Этот счетчик отображает текущее количество блоков синхронизации в использовании. Блоки синхронизации - это структуры данных для объекта, выделенные для хранения информации синхронизации. Блоки синхронизации хранят слабые ссылки на управляемые объекты и должны быть отсканированы сборщиком мусора. Блоки синхронизации не ограничиваются хранением информации синхронизации и могут также хранить метаданные COM interop. Этот счетчик был разработан для указания проблем производительности при интенсивном использовании примитивов синхронизации.

Счетчик блоков синхронизации, похоже, сбрасывается, когда мы переключаемся на другое приложение. Что именно заставляет их создавать, и есть ли советы по сокращению их числа?

(кстати, это на самом деле пишется «раковина блок» в списке счетчиков производительности. Я не уверен, если его опечатка или водопроводная шутка)

+0

Лучше назовите их блоки синхронизации, безусловно, в заголовке. –

ответ

19

Everytime вы используете замок примитив, такие как lock или Monitor.Enter в платформе .NET, структура блока синхронизации инициализируется против экземпляра объекта, который должен быть заблокирован. Как указано в определении, эти блоки могут содержать больше информации, такой как хэш-код объекта и информация взаимодействия COM.

Поскольку эти блоки ограничены тем, что может быть сохранено, одновременный доступ к блокам вызывает конфликт, что, в свою очередь, приводит к тому, что содержимое заголовка объекта становится индексом в таблицу общесистемных блоков синхронизации, управляемых средой CLR. CLR может перерабатывать этот блок синхронизации по мере необходимости и в случае необходимости.

Блокировка объекта всегда приводит к выходу ЦП перед ожиданием на объекте системного ядра. Всякий раз, когда выделенное прерывание ЦП не удовлетворено, чтобы позволить монитору получить блокировку критического участка, будет создан дескриптор события автоматического сброса системы, и ссылка на него будет помещена в соответствующий блок синхронизации. Другие потоки, ожидающие этого дескриптора события, затем блокируют дескриптор события до тех пор, пока собственный поток не инициирует выпуск дескриптора события.

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

+0

Возможно, также имеет смысл упомянуть, что вызов GetHashCode() также инициализирует блок синхронизации. –

+0

@VincePanuccio Я считаю, что это была вещь .NET 1.1? (То есть CLR делает это сегодня?) – user2864740

Смежные вопросы