Graphics.DrawImage OutOFMemory Exception - PullRequest
2 голосов
/ 07 марта 2011

Я получаю исключение OutOfMemory при попытке изменить размеры больших изображений. Наш сервер может изменять размеры изображений менее 1000x1000 пикселей. Кажется, моя машина разработки обрабатывает любой размер, а другие машины разработчика имеют те же ограничения, что и сервер. Моя машина для разработки также лучшая спецификация.

Мне кажется, что этот код правильно удаляет все объекты, но я могу ошибаться. Я пытался использовать perfmon для просмотра памяти .Net CLR, но не уверен, как интерпретировать результаты.

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

Редактировать: ошибка возникает на g.DrawImage

using(Image imgToResize = Image.FromFile(path))
        {
            using (Bitmap b = new Bitmap(ResizeWidth, ResizeHeight, PixelFormat.Format24bppRgb))
            {
                using(Graphics g = Graphics.FromImage(b))
                {
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(imgToResize, 0, 0, ResizeWidth, ResizeHeight);
                    b.Save(DiskPathThumb(maxSize), ImageFormat.Jpeg);
                }
            }
        }

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Можете ли вы сделать скриншот счетчиков для PrivateBytes, размера LOH, коллекции #Gen 2?

Что это за приложение? Насколько это глубоко в коде вашего приложения? Сколько объектов у вас на LOH? Поскольку возвращаемый буфер определенно квалифицируется как Большой объект. Вы смотрели на стек вызовов, состояние кучи и фрагментацию при запуске этого вызова?

FWIW, вы можете попробовать тот же код в версии C или C ++, которая использует GDI. Каждая из используемых вами функций, связанных с графикой, является оберткой вокруг GDI и проверяет, что в тестовом приложении на сбойных машинах можно сузить круг вещей до .Net Framework, а не что-то еще.

Мне не удалось получить исключение OOM, но наибольшее значение, которое я мог передать, было около 19866x19866, прежде чем функция выдаст исключение InvalidParameterException. Это на 64-битной Win7 с таргетингом на .Net 4 с VS2010.

0 голосов
/ 01 мая 2011

Оказывается, это было как-то связано с тем, что мы использовали SessionPageStatePersister, что заставляло наш gen2 стек постоянно расти со временем, и в какой-то момент, прежде чем пул приложений был перезапущен, наши системы вообще не могли справиться ,

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

...