在添加新的数据库表,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循环中做错了吗?还有其他问题吗?
如果有必要,我很乐意提供更多代码。
感谢您的帮助。
乔
答案 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();
}