Я создаю много пользовательских элементов управления и добавляю их к FlowLayoutPanel. Существует также ContextMenuStrip, созданный и заполненный во время проектирования.
Каждый раз, когда управление добавляется к панели, этому присвоили ее свойство ContextMenuStrip этому меню, так, чтобы все средства управления "совместно использовали" то же меню. Но я заметил, когда средства управления удаляют из панели и избавляются, память, используемая в Диспетчере задач, не отбрасывает. Это повышается приблизительно на 50 КБ каждый раз, когда управление создается и добавляется к панели расположения.
Я загрузил суд над Профилировщиком Памяти.NET, и он показал, что были ссылки на полосу меню, бродящую вокруг после того, как средства управления были расположены. Я изменил код для явной установки свойства ContextMenuStrip в NULL перед избавлением от управления, и да, память теперь освобождена. Почему это? Разве GC не должен очищать этот тип вещи?
Если вы посмотрите на свойство ContexmenuStrip в Control, вы увидите, что сеттер подписывает элемент управления на событие Disposed в MenuStrip, создавая обратную ссылку от MenuStrip к Control.
Это означает, что это классический случай достижимого сквозного события, и вы уже нашли решение: установите свойство ContexmenuStrip в null.