2010-10-06 3 views
0

У меня есть программа, которая использует много изображений. Он загружает много изображений из файла и сохраняет их, поэтому они загружаются только один раз. Он также создает несколько BufferedImages, около 400x400, их будет не более 10.Java-изображения занимают слишком много памяти

Изображения из файла всего около 6 МБ. Каждый BufferedImage должен быть приблизительно 400x400x4 = 640 КБ.

Тем не менее, использование памяти составляет 500 МБ!

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

Кто-нибудь знает, что с этим делать? Или альтернатива BufferedImage, которая использует меньше памяти?

+3

Звучит подозрительно, я бы обвинил ваш код, прежде чем обвинять библиотеки, извините. Позаботьтесь, чтобы вставить некоторые из них? Что происходит, когда вы вынуждаете сборщика мусора работать? Должны быть некоторые профилировщики памяти для java. http://www.google.com/#hl=en&expIds=17259,18168,26792,26885,27006&sugexp=ldymls&xhr=t&q=memory+profiler+java&cp=17&pf=p&sclient=psy&safe=off&aq=0&aqi=g4g-o1&aql=&oq = memory + profiler + j & gs_rfai = & pbx = 1 & fp = 7c8f32f65b860aba –

+0

Согласитесь с Hamish, это может быть ошибка в коде, который загружает и кэширует изображения. Возможно, это загрузка и кеширование изображений более одного раза. –

+0

Да, изначально я предполагал, что это была утечка памяти. Но как только оно начинается, самое большее, 10 из 400x400 BufferedImages сделаны. И это 500MB в начале, оно, кажется, не растет оттуда, его просто огромная сумма в начале. @Hamish Мы пытались заставить сборщика мусора, но это не слишком много. Когда я получаю шанс, я просмотрю инструменты профилирования памяти. Что касается вставки кода, это было бы довольно непрактичным, поскольку на самом деле это скорее спагетти-иш. Мы работаем над приключенческой игрой для группового проекта для университета, а код - полный беспорядок. – DanielGibbs

ответ

4

Звучит так, как будто ваше приложение (а не библиотека) имеет утечку памяти. В первом случае вы должны попытаться определить утечку, используя стандартный профилировщик Java памяти.

EDIT

Теперь вы определили, что есть много BufferedImages торчать, следующая вещь, что вам нужно сделать, это выяснить, почему они все еще достижимы. Возьмите кучу кучи, посмотрите на некоторые примеры и посмотрите, как они связаны с кучевым корнем; см. http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/heapdump.html

При выполнении такого рода материалов полезно ознакомиться с соответствующими частями исходного кода Java, используя вашу любимую Java-среду IDE.

+0

Стивен, как его можно использовать? Любые хорошие ссылки? Благодарю. –

+1

Начните с VisualVM http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/profiler.html ... или просмотрите результаты поиска Google, указанные выше, в комментарии. –

+0

Спасибо! Я не понимал, что все это время на моей машине ... Ну, похоже, что BufferedImages - проблема, у меня 206 из них = O. Но ни один из моих объектов не имеет ссылок на большинство из них! Таким образом, они, кажется, придерживаются после того, как я закончил с ними ... – DanielGibbs

1

Является ли ваша программа веб-приложением? или вы разрабатываете JRE-подобное приложение? Как загрузить изображения?

В веб-приложении я бы использовал изображение CSS-Sprite для решения моей проблемы, поскольку он отключил несколько HTTP-запросов и улучшил использование полосы пропускания и использование памяти при загрузке.

В приложении JRE должен быть способ использования спрайта изображений таким же образом, загружая смещение 400x400 вашего спрайта изображений, чтобы уменьшить использование объекта BufferedImage и повысить производительность.

+0

Это обычная программа JRE. Изображения, загруженные из файла, используют Toolkit.getDefaultToolkit(). CreateImage (imageName). BufferedImages создаются с использованием стандартного конструктора BufferedImage. Не совсем уверен, что вы имеете в виду в изображении спрайта, есть ли у вас пример? – DanielGibbs

+0

Вы можете проверить этот веб-сайт для веб-версии спрайта: http://css-tricks.com/css-sprites/ Я до сих пор не нашел способа реализовать такую ​​технику в JRE-ориентированная программа, возможно, руководство Stephen C могло бы помочь. – LoganWolfer

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