2012-10-02 32 views
0

我想在使用JSP的页面上显示5000条记录。但是我正在摆脱内存异常。我这样做的,java.lang.outofmemoryError java

<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)或将如果我使用分页这个错误会等等?

+7

“我试图在页面上显示5000条记录” - 不,你不想这样做。更重要的是,你的用户不想消化那么多记录。您可能通过分页消除错误。如果Google和Stackoverflow足够好,为什么不适合你? – duffymo

+2

没有像样的网站每页显示超过100行。您应该为您的数据表分页以提高性能。此外,**你不应该在你的代码中使用** scriptlet,阅读(并应用)[如何避免JSP-文件中的Java代码?](http://stackoverflow.com/a/3180202/1065197)。 –

+1

字符串占用了内存,并且您在这里创建了数千个字符串,这可以快速填充内存。我不会每次创建5个字符串(hdr1-5),而是直接将它们放在stringbuilder.append中。另外,在你的构建器中使用多个“.append()”,比如stringBuilder.append(“​​”).append(row [0])。append()等.. – Logan

回答

0

我正在想这样的东西更多追加。

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()); 
1

因为你的代码示例在某种程度上被破坏了很难说,但是有两个地方会导致内存问题。 A)您test.fetchdata() B)的追加到StringBuilder

初始的B,如果你是直接在JSP你可以尝试直接输出它,而不是使用StringBuilder。根据JSP编译器的不同,它可能会生成更小的StringBuilders,它们不应占用太多内存。

但最有可能的问题是A.你找回已经占用很多内存的长列表。 你只能通过做一些惰性加载的结果(在迭代器中)或者当你通过分页建议自己(这是值得推荐的,因为所有的注释都表示:-))

还有最后一个选项也许值得当有很多重复的字符串时尝试。在将字符串存储在数组中之前,在fetchdata()方法内部使用.intern()。这可以防止多个相同的字符串占用额外的堆,但需要花费一点CPU时间来计算。

相关问题