Приложение VB.Net 3.5 MDI - формы MDIChild перестают открываться после использования памяти N

Я надеюсь, что кто-то может быть в состоянии помочь!

У нас есть довольно большое приложение VB.Net MDI, которое было преобразовано из VB6. При первом запуске без открытых форм MDIChild используется около 35 000 КБ. По мере того, как все больше и больше форм открывается (но не закрывается), использование памяти (согласно диспетчеру задач) увеличивается примерно до 4000 КБ на форму. (Я знаю, что TM показывает только выделенную память для приложения, а не фактическую используемую память.)

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

Например: - На виртуальной машине всего с 512 МБ для всей машины, кажется, около 7-8 форм, а выделенная память составляет около 80 000 КБ, когда это происходит. - На нашей машине с терминальным сервером, которая имеет 3 ГБ и также работает с различными другими приложениями, она останавливается на уровне около 20+ форм и выделении памяти около 100 000–105 000 КБ.

Я попытался использовать perfmon, чтобы увидеть, есть ли утечка, и это указывает на постоянное использование.

Однако, даже если я закрою формы, выделенная память уменьшится только примерно на 3000 КБ для первой закрытой формы, а затем на 100 КБ для каждой формы, закрытой после. Если я затем добавлю еще несколько форм, память увеличится, и если я затем закрою те же самые -3000K, -100K, снова произойдет сокращение памяти.

Кто-нибудь сталкивался с этим раньше? Может ли кто-нибудь помочь, так как это похоже на шоу-стоппер! Я с нетерпением жду ваших ответов.

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

EDIT: Мне только что удалось получить ту же ошибку в dev. Похоже, что в UserControl выбрасывается исключение WIN32Exception. Ошибка "Ошибка создания дескриптора окна".

Спасибо и с уважением, Дуэйн.


person Dib    schedule 08.07.2010    source источник


Ответы (2)


Ваше приложение просто потребляет квоту дескрипторов, установленную Windows. По умолчанию это 10 000 дескрипторов, попытка создать другое окно завершится с ошибкой «Ошибка создания дескриптора окна».

Возможно, эти ограничения ниже для установки VM или TS, не уверен. Верхний предел довольно огромен, и у вас никогда не должно возникнуть проблем с тем, чтобы держаться подальше от него. В диспетчере задач используйте View + Select Columns и отметьте объекты USER, объект GDI и дескрипторы. Любой из этих столбцов, растущий без ограничений, является верным признаком ошибки в вашем коде, например, отсутствие удаления форм или элементов управления. Потребление большего объема памяти является побочным эффектом этой утечки.

person Hans Passant    schedule 08.07.2010
comment
Спасибо, Ганс. Вы правы, это количество объектов USER. Он достигает 9 999, а затем приложение бомбы. С уважением, Дуэйн. - person Dib; 08.07.2010
comment
Следующая проблема — выяснить, почему существует так много объектов USER! - person Dib; 08.07.2010
comment
Я не вижу здесь ваш код, но использование Controls.Clear() или Controls.Remove() без вызова Dispose() для элементов управления, которые вы удалили явно, вызывает эту проблему. - person Hans Passant; 08.07.2010
comment
Пожалуйста, не стесняйтесь голосовать за полезные ответы. У вас достаточно репутации. - person Hans Passant; 15.08.2010

Оказывается, нам нужно было явно удалить каждый отдельный элемент управления в наших пользовательских элементах управления до того, как будут выпущены объекты USER.

person Dib    schedule 12.07.2010