Настройки Java на Tomcat

Рейтинг: 2Ответов: 1Опубликовано: 25.02.2011

Здравствуйте. У меня часто возникают проблемы OutOfMemory... PermGen. Принцип работы приложения заключается в том, чтобы по запросам пользователя генерировать документы (Excel, PDF, ...) и отправлять на страницу пользователю для закачки. Приложение написано на JSF, JPA (провайдер Hibernate). Что тут можно сделать?

Добавлено.

Вот код, который выдает на выход сгенерированный документ:

public void prepareDocument() 
    throws IOException, DBUtilException, MartixOfTestResultException, NotResultsForGeneratingException {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
    //todo Говорим документу, что это приложение/ открывать при помощи приложения.
    response.setContentType("application;");
    //todo Берем документ в виде байтов
    byte[] fileContent = getByteArrayOutputStream().toByteArray();
    response.setContentLength(fileContent.length);
    response.setHeader("Content-disposition", "attachment; filename=" + "Book.xls");
    ServletOutputStream out;
    try {
        out = response.getOutputStream();
        out.write(fileContent);
        out.flush();
        facesContext.responseComplete();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Подозрение мое падает только на этот метод.

Ответы

▲ 5Принят

В общем, как Вы уже поняли, JVM больше не может получить памяти от ОС для Вашего процесса. То есть Ваш код что-то такое делает, что жутко потребляет память.

Вариантов несколько.

  1. Действительно требуется очень много памяти (создается огромный массив, жутко наполняется коллекция);
  2. Вы имеете в коде ошибку, которая приводит к потерям памяти (рекурсия без выхода, бесконечный цикл, фатальные остановы нитей устаревшим методом stop() в классе Thread, открытие большого количество потоков: файла и т.п.).

Первый вариант, я думаю, Вы рассматривали в первую очередь. Правда, если для того же самого экспорта данных в Excel и другие формы, Вы используете какие-то экзотические библиотеки, проблема может быть в них.

Второй вариант тоже возможен, изучите Ваш код или выложите ключеые фрагменты здесь. Ищите дыры: потребители ресурсов. Обратите внимание, создаете ли свои нити?