VB.Net 3.5 MDI Application - формы MDIChild перестают открываться после использования N-памяти - PullRequest
0 голосов
/ 08 июля 2010

Я надеюсь, что кто-то сможет помочь!

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

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

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

Я попытался с помощью perfmon проверить, есть ли утечка, и это указывает на устойчивое использование.

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

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

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

РЕДАКТИРОВАТЬ: Мне только что удалось получить ту же ошибку в dev. Похоже, что в UserControl создается исключение WIN32Exception. Ошибка «Ошибка создания дескриптора окна».

Спасибо и всего наилучшего, Дуэйн.

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

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

0 голосов
/ 08 июля 2010

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

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

...