Ваша память, вероятно, фрагментирована из-за многочисленных строковых операций или других операций, которые создают и освобождают небольшие блоки памяти, такие как упаковка / распаковка.
Вы получите это исключение, когда CLR не сможет выделить достаточно большой свободный блок памяти.
Я использую «CLR Profiler» и проверяю распределение памяти. Если вы видите многочисленные белые пятна (свободные блоки) и нет больших свободных блоков, вам нужно начать смотреть на то, как вы распределяете объекты.
Например, перед тем, как присваивать одну строку другой, проверьте, отличаются ли строки в первую очередь. Использование StringBuilder - это все случаи, исключающие бокс и другие оптимизации памяти.
Я использую эту технику и полностью исключаю исключения, за исключением известной проблемы с двоичной десериализацией.
Откройте для себя утраченное искусство оптимизации памяти в управляемом коде в http://msdn.microsoft.com/en-us/magazine/cc163856.aspx
Исследование проблем с памятью при http://msdn.microsoft.com/en-us/magazine/cc163528.aspx
Оптимизация производительности в Visual Basic .NET при http://msdn.microsoft.com/en-us/library/aa289513(v=vs.71).aspx