Что такое "Блок синхронизации" и советы по сокращению количества

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

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

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

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

(Кстати, в списке счетчиков производительности написано "раковина", я не уверен, что это опечатка или шумоизоляция)

Ответы

Ответ 1

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

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

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

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