Прежде чем спрашивать, я сделаю небольшой отказ от ответственности: да, я знаю о различиях между виртуальной памятью, физической памятью и рабочим набором. Все числа ниже относятся к виртуальной памяти.
Ситуация такова: у нас есть 32-разрядное приложение C #, которое импортирует библиотеки x86 C ++ (с множеством собственных зависимостей, поэтому переход на x64 в настоящее время не вариант). Приложение загружает большой набор данных через неуправляемый компонент, а затем пытается отобразить его (отчет).
Однако, когда набор данных особенно велик, при добавлении элемента в список выдается исключение OutOfMemory, как в коде ниже:
Здесь нет ничего удивительного. Однако что удивительно, так это тот факт, что у приложения все еще есть около 280 МБ свободной виртуальной машины.
При отладке чисто неуправляемых приложений (C ++) этого никогда не было - bad_alloc можно было получить только в том случае, если не осталось свободной виртуальной машины или если не было свободного фрагмента адресного пространства достаточного размера.
Отсюда вопрос - в чем может быть причина? Я понимаю, как бороться с этой проблемой - неуправляемые компоненты действительно потребляют много памяти, а также создают большую фрагментацию - но в чем причина столь раннего появления OutOfMemoryException?
Рассматриваемый код выглядит так:
List<Cell> r = new List<Cell>(cols);
for (int j = 0; j < cols; j++)
{
r.Add(new CustomCell()); // The exception is thrown on this line
}
На момент исключения в списке (в одном случае) было 85 элементов, а его вместимость составляла 200 с чем-то (количество столбцов, как указано в конструкторе). Итак, исключение, скорее всего, произошло в распределении CustomCell. У объекта CustomCell много полей, но его размер определенно меньше 1 КБ. 280 Мбайт свободной памяти располагаются блоками от 64 Кбайт до 14 Мбайт, поэтому должно быть достаточно места для ее распределения.
OutOfMemory exception is thrown upon adding an item to the list.
что это за список? - person Sriram Sakthivel   schedule 05.09.2013