2012-04-29 3 views
-1

Я новый разработчик программного обеспечения и действительно нуждаюсь в некоторой помощи. Мне была поручена генерация PDF из данных в базе данных с использованием FOP. Я написал программу, и она работает, но не во всех ситуациях. Все работает до тех пор, пока количество строк данных, которые я извлекаю, довольно мало - до менее чем 10000 строк. Когда я пытаюсь создать отчет для наборов данных размером более 10000 строк, я получаю ошибку из памяти (куча Java-кучи).FOP - OutofMemoryError при генерации PDF из данных базы данных

код, который считывает из базы данных:

while (rs.next()) { 
    EMP_ID = rs.getString("EMP_ID"); 
    EMP_NAME = rs.getString("EMP_NAME"); 
    EMP_SALARY = rs.getString("EMP_SALARY"); 
    EMP_PROJECT = rs.getString("EMP_PROJECT"); 
    EMP_POSITION = rs.getString("EMP_POSITION"); 
    team.addMember(d.DataGetSet(EMP_ID, EMP_NAME, EMP_SALARY, EMP_PROJECT, 
     EMP_POSITION)); 
} 

я увеличил память для программы до 2 Гб, но по-прежнему возникает ошибка. Любая помощь в решении этой проблемы будет оценена по достоинству.

+1

Трудно диагностировать, что может быть неправильно с вашей программой, не видя кода. Добавьте соответствующие вопросы к своему вопросу. – Perception

+0

в то время как (rs.next()) \t \t \t { \t \t \t \t \t \t \t \t EMP_ID = rs.getString ("EMP_ID"); \t \t \t \t EMP_NAME = rs.getString ("EMP_NAME"); \t \t \t \t EMP_SALARY = rs.getString ("EMP_SALARY"); \t \t \t \t EMP_PROJECT = rs.getString ("EMP_PROJECT"); \t \t \t \t EMP_POSITION = rs.getString ("EMP_POSITION"); \t \t \t \t team.addMember (d.DataGetSet (EMP_ID, EMP_NAME, EMP_SALARY, \t \t \t \t \t \t EMP_PROJECT, EMP_POSITION)); \t \t \t} – sai

+0

Таты Петля я использовать для извлечения данных и передать его в метод получения и установки, а также добавить его в ArrayList с именем элемента, так что я могу использовать его написать XML или Ф.О. файл – sai

ответ

1

Если у вас заканчивается память, и вы не знаете, с чего начать, я предлагаю подход с разделением и победой, чтобы направлять вас в нужную область. Например, закомментируйте код, который создает PDF, затем снова проверьте. У вас заканчивается память? Если да, закомментируйте добавление части к массиву (но держите вызов d.DataGetSet) и повторите тест. Это, мы надеемся, позволит вам узнать, куда атаковать, не узнав, как профилировать память Java (у которой есть собственная кривая обучения).

Если вы все еще ничего не получаете, попробуйте использовать JVisualVM (часть JDK). Подключите его к вашему приложению, когда он запущен, и выполните «сброс кучи». Это может помочь вам определить, что висит на столько памяти.

И наконец - вы уверены, что подняли память и вступили в силу? Просто двойная проверка.

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