2010-10-23 4 views
2

У меня есть приложение asp.net, которое использует устаревшую библиотеку COM-взаимодействия. Работает нормально, пока память не достигнет где-то около 500 МБ, а затем больше не сможет создавать новые COM-объекты (получить различные исключения, например, создать экземпляр COM-компонента с CLSID {FFFF-FFFF-FFFF-FFF-FFFFFF} из IClassFactory не удалось из-за следующей ошибки: 80070008.). Похоже, что он нажимает какой-то предел памяти, но что это? Можно ли это изменить?asp.net interop ограничение памяти

Решенный! Оказывается, объект создавал дескриптор окна, и мы попадали в ограничение дескриптора окна 10K (за исключением того, что это происходило в экземплярах 2K по какой-либо причине, когда внутри IIS)

+0

Вы правильно распоряжаетесь этими COM-объектами? –

+0

Да, я прямо их освобождаю. Проблема не в том, что это утечка памяти, использование памяти в норме - есть только много одновременных пользователей. На сервере все еще много RaM, но как-то он застревает. (только что запустил еще один тест, и проблема возникла с использованием только 100 МБ ... weird) –

+1

Являются ли эти COM-объекты в процессе или вне процесса? Какова их модель квартиры? Являются ли они помечены как «Апарамент», «Свободный», «Оба», «Один»? Является ли ОС 32-разрядной или 64-разрядной? Связаны ли эти компоненты с оболочкой или некоторым пользовательским интерфейсом? –

ответ

1

Какая ОС, и это 32-разрядная или 64-разрядная? Что вы используете для определения использования памяти?

Когда вы говорите, что явно освобождаете объекты, вы имеете в виду, что используете маршал.ReleaseComObject()?

Я предполагаю, что у вас есть AspCompat = true в вашем теге <% @ Page ... не ожидал, что он будет запущен вообще, если вы этого не сделали.

Можете ли вы дать нам некоторые детали вашего COM-объекта; что он делает, и можете ли вы опубликовать код, в котором вы его вызываете, включая сигнатуры COM-объектов? Сколько памяти вы ожидаете от одного объекта?

Мой первый подозреваемый, основанный только на информации, которую я читал до сих пор, заключается в том, что 500 МБ не является действительно общей используемой памятью и/или что у вас есть проблема фрагментации памяти. Я видел, как это происходит с процессами IIS, когда используется менее половины используемой памяти, и ошибки имеют тенденцию быть случайными, в зависимости от того, какой объект создается в то время. BTW, 80070008 «недостаточно места для хранения».

Ограничения по процессу составляют 2 ГБ на 32-битной машине, конечно, но даже если процесс не использует полный 2 ГБ, если не существует непрерывного блока памяти размера, необходимого при создании объекта, Когда вы попытаетесь выделить, вы получите ошибку из памяти. Множество одновременных пользователей подразумевает выделение и освобождение COM-объектов (и других объектов) за короткий промежуток времени ... что указывает на фрагментацию в качестве подозреваемого.

Выполнение плана атаки требует больше информации о COM-объекте и способах его использования.

+0

Принимается как наиболее полезным. –

0

Использовать шаблон команды для организации очередей и выполнения компиляции в асинхронный поток. Это может освободить количество потоков, используемых iis, и позволить вам контролировать количество вызовов/экземпляров com-приложения.

0

Вы можете думать об объединении объектов, а не создавать каждый раз новый объект.

2

Решенный! Оказывается, объект создавал дескриптор окна, и мы попадали в ограничение дескриптора окна 10K (за исключением того, что это происходило в экземплярах 2K по какой-то причине, когда внутри IIS)

+0

Ahhh !!!! В этом есть смысл. –

+0

Вы действительно вернулись через 5½ лет и не приняли мой ответ? XD Не беспокойтесь, лучше, чтобы у людей был фактический ответ наверху, просто забавный :) –

Смежные вопросы