Что такое «Блок синхронизации» и советы по уменьшению количества - PullRequest
18 голосов
/ 26 ноября 2009

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

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

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

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

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

1 Ответ

25 голосов
/ 27 ноября 2009

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

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

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

Следовательно, если этот счетчик постоянно увеличивается, это признак того, что слишком много потоков находится в состоянии конкуренции за блокировку одного или нескольких объектов, и эти блокировки могут никогда не освободиться.

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