Из кучи места в спящем режиме - в чем проблема? - PullRequest
0 голосов
/ 16 декабря 2010

Я сталкиваюсь со следующей (обычной) ошибкой после добавления новой таблицы БД, класса hibernate и других классов для доступа к классу hibernate:

java.lang.OutOfMemoryError: пространство кучи Java

Вот соответствующий код:

С .jsp:

<% 
com.companyconnector.model.HomepageBean homepage = new com.companyconnector.model.HomepageBean();
%>

С HomepageBean:

public class HomepageBean {

        ...

    private ReviewBean review1;
    private ReviewBean review2;
    private ReviewBean review3;



    public HomepageBean () {

        ...

        GetSurveyResults gsr = new GetSurveyResults();
        List<ReviewBean> rbs = gsr.getRecentReviews();  
        review1 = rbs.get(0);  
        review2 = rbs.get(1);
        review3 = rbs.get(2);
}

От GetSurveyResults:

public List<ReviewBean> getRecentReviews() {

    List<OpenResponse> ors = DatabaseBean.getRecentReviews();
    List<ReviewBean> rbs = new ArrayList<ReviewBean>();


    for(int x = 0; ors.size() > x; x =+ 2) {

     String employer = "";
     rbs.add(new ReviewBean(ors.get(x).getUid(), employer, ors.get(x).getResponse(), ors.get(x+1).getResponse()));

    }

    return rbs;

}

и, наконец, из DatabaseBean:

public static List<OpenResponse> getRecentReviews() {

  SessionFactory session = HibernateUtil.getSessionFactory();
  Session sess = session.openSession();
  Transaction tx = sess.beginTransaction();

  List results = sess.createQuery( 
    "from OpenResponse where (uid = 46) or (uid = 50) or (uid = 51)"
  ).list();

  tx.commit();
  sess.flush();
  sess.close();
  return results;

}

Извините за весь код и такое длинное сообщение, но я получаю более миллиона экземпляров ReviewBean (я использовал jProfiler, чтобы найти это).Я делаю что-то не так в цикле for в GetSurveyResults?Любые другие проблемы?

Я рад предоставить больше кода, если это необходимо.

Спасибо за помощь.

Джо

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

Также вы, вероятно, захотите закрыть транзакцию сеанса / фиксации, если блок finally гарантирует, что всегда вызывается событие, если ваш метод выдает исключение. Стандартный шаблон для работы с ресурсами в Java (упрощенный псевдокод):

Session s = null;
try {
 s = openSession();
 // do something useful
}
finally {
  if (s != null) s.close();
}
0 голосов
/ 16 декабря 2010

Использование JProfiler для определения того, какие объекты занимают память, является хорошим первым шагом.Теперь, когда вы знаете, что без необходимости создается много экземпляров, следующим логическим шагом анализа является запуск приложения в режиме отладки и пошаговое выполнение кода, выделяющего ReviewBeans.Если вы это сделаете, ошибка должна быть очевидной.(Я почти уверен, что заметил это, но я бы лучше научил вас, как находить такие ошибки самостоятельно. Это навык, необходимый для любого хорошего программиста).

...