2013-10-25 3 views
0

Я создаю веб-сайт с использованием Java Spring и Hibernate и используя Tomcat 7 в качестве сервера. У меня есть страница этого сайта, где, как только пользователь нажимает на изображение, загружаются два других изображения. Рабочий процесс следующий:outOfMemory java пустое место на сервере tomcat, не отображается локально

Изображение с кликом -> Расчет (весенний метод) -> Изображения, сохраненные на сервере как jpg -> Изображения, обновленные с сервера и отображаемые клиенту.

Изображения загружаются как следующим образом:

response.setContentType("image/jpg"); 
    OutputStream out = response.getOutputStream(); 
    FileInputStream in = new FileInputStream(xzCrossUrl); 
    int size = in.available(); 
    byte[] content = new byte[size]; 
    in.read(content); 
    out.write(content); 
    in.close(); 
    out.close(); 

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

Локально он работает нормально, но когда я помещаю .war в каталог tomcat и подключаюсь к серверу, возникает проблема кучи Java outOfMemory, и изображения загружаются намного медленнее, чем локально.

Я попытался увеличить память, используемую tomcat, но, похоже, она не работает; возможно, я делаю что-то неправильно.

Не могли бы вы помочь мне в этом?

спасибо, что заблаговременно!

+0

Попробуйте эти шаги сказал здесь первый: http://stackoverflow.com/questions/2718786/how- to-increase-java-heap-space-for-a-tomcat-app – ogzd

+0

Спасибо за ссылку. Я попытался увеличить пространство кучи tomcat ранее, но это не устранило проблему. Я попытаюсь установить jprofile, как только это возможно, и дайте знать – LeviathanS17

ответ

1

Я не могу поставить это в комментарии, потому что у меня нет достаточного количества креди, так что ...

Хотя это может быть что-то можно исправить с помощью конфигурации Tomcat, какой код у вас есть не будет масштабироваться для любого изображения. Вы должны объявить byte[] быть фиксированным размером, а затем читать и писать до тех пор, пока вы потребляли все файловые байты:

// as a class scoped constant
private static final int BUFFERSIZE = 1024 << 8;

BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream(), BUFFERSIZE); 
BufferedInputStream in = new BufferedInputStream(new FileInputStream(xzCrossUrl)); 
int bytesRead = 0; 
byte[] content = new byte[BUFFERSIZE]; 
while((bytesRead = in.read(content) != -1){ 
    out.write(content,0,bytesRead); 
} 
// Don't forget appropriate exception handling with a try/finally! 
in.close(); 
out.close(); 

FYI: Я написал это здесь, а не в IDE и не компилируюсь это, поэтому мои извинения, если не совершенны. Надеюсь, вы получите суть.

+0

Спасибо за ваш ответ. Вы пропустили скобу в то время, но это нормально :) К сожалению, это не решило мою проблему. Я начинаю думать, что проблема заключается в вычисляющей части, выполняющей изображения. Я не знаю, может ли проблема быть в конфигурации сервера. – LeviathanS17

0

Как насчет использования IOUtils.copy() из пакета ввода-вывода Apache Commons - который будет копировать входной поток в выходной поток и будет внутренне буферизован, поэтому вам не нужно.

response.setContentType("image/jpg"); 
OutputStream out = response.getOutputStream(); 
FileInputStream in = new FileInputStream(xzCrossUrl); 
IOUtils.copy(in, out); 

IOUtils.closeQuietly(in); 
IOUtils.closeQuietly(out); 

Для больших файлов, которые вы можете использовать IOUtils.copyLarge()

Для получения дополнительной информации о Commons IO см http://commons.apache.org/proper/commons-io/

+0

Спасибо за отзыв, но это не решило мою проблему :(Может быть, проблема не в загрузке изображений – LeviathanS17

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