[英]java.lang.outofmemoryError java
我正在尝试使用JSP在页面上显示5000条记录。 但是我要摆脱内存异常。 我这样做是
<TABLE><tr><td>Header1</td><td>Header2</td><td>Header3</td><td>Header4</td><td>Header5</td></tr>");
<%Test test = new Test();
List myList = test.fetchdata();
Iterator itr = myList.iterator();
while(itr.hasNext())
{
Object[] row = (Object[]) itr.next();
String hdr1 = (String) row[0];
String hdr2 = (String) row[1];
String hdr3 = (String) row[2];
String hdr4 = (String) row[3];
String hdr5 = (String) row[4];
stringBuilder.append"<tr><td>'"+hdr1+"'</td><td>'"+hdr2+"'</td><td>'"+hdr3+"'</td><td>'"+hdr4+"'</td><td>'"+hdr5+"'</td></tr>");
}
stringBuilder.append("</TABLE></body></html>");
out.print(stringBuilder.toString());
%>
1)如果我想决定在屏幕上保留5000条记录,我的代码有什么问题吗
2)或者如果我使用分页等会不会出现此错误?
因为您的代码示例以某种方式被破坏,所以很难说,但是有两个地方导致了内存问题。 A)您的test.fetchdata()B)您追加到StringBuilder
从B开始,如果您直接在JSP上,则可以尝试直接输出它,而不是使用StringBuilder。 根据JSP编译器的不同,它可能会产生较小的StringBuilder,它们不应占用太多内存。
但最有可能是问题出在A中。您将获得一长串已经占用大量内存的列表。 您只能通过在结果中进行一些延迟加载来优化(在迭代器中),或者通过分页来建议自己(建议这样做,因为所有注释都表明:-))
当有很多重复的字符串时,还有最后一种选择可能值得尝试。 在fetchdata()方法中,在将String存储在数组中之前,请使用.intern()。 这样可以防止多个相同的字符串占用额外的堆,而这会花费一些cpu时间。
我在想添加更多类似的东西。
List myList = test.fetchdata();
Iterator itr = myList.iterator();
StringBuilder stringBuilder = new StringBuilder("");
while (itr.hasNext()) {
Object[] row = (Object[]) itr.next();
String hdr1 = (String) row[0];
String hdr2 = (String) row[1];
String hdr3 = (String) row[2];
String hdr4 = (String) row[3];
String hdr5 = (String) row[4];
stringBuilder.append("<tr><td>'").append(hdr1)
.append("'</td><td>'").append(hdr2).append("'</td><td>'")
.append(hdr3).append("'</td><td>'").append(hdr4)
.append("'</td><td>'").append(hdr5).append("'</td></tr>");
}
stringBuilder.append("</TABLE></body></html>");
out.print(stringBuilder.toString());
或可能将其重构为此。
List myList = test.fetchdata();
Iterator itr = myList.iterator();
StringBuilder stringBuilder = new StringBuilder("");
while (itr.hasNext()) {
Object[] row = (Object[]) itr.next();
stringBuilder.append("<tr><td>'").append(row[0])
.append("'</td><td>'").append(row[1]).append("'</td><td>'")
.append(row[2]).append("'</td><td>'").append(row[3])
.append("'</td><td>'").append(row[4]).append("'</td></tr>");
}
stringBuilder.append("</TABLE></body></html>");
out.print(stringBuilder.toString());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.