休眠堆空间 - 问题是什么?

时间:2010-12-16 19:08:34

标签: java hibernate out-of-memory

在添加新的数据库表,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来查找)。我在GetSurveyResults的for循环中做错了吗?还有其他问题吗?

如果有必要,我很乐意提供更多代码。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

使用JProfiler查找占用内存的对象是一个很好的第一步。既然您已经知道创建了许多不必要的实例,那么逻辑上的下一步分析步骤就是以调试模式运行您的应用程序,并逐步执行分配ReviewBeans的代码。如果你这样做,bug应该是显而易见的。 (我很确定我发现了它,但我宁愿教你如何自己找到这样的bug。对于任何优秀的程序员来说,这是一项必不可少的技能。)

答案 1 :(得分:0)

如果你的方法抛出异常,你可能还想关闭session / commit事务,如果是finally块,以确保它总是被调用事件。在java中使用资源的标准模式(简化伪代码):

Session s = null;
try {
 s = openSession();
 // do something useful
}
finally {
  if (s != null) s.close();
}