0

我正在尝试使用 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)或者如果我使用分页等,这个错误会消失吗?

4

2 回答 2

1

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

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

但很可能问题出在 A 中。您会返回一个已经占用大量内存的长列表。您只能通过对结果进行一些延迟加载(在迭代器中)或通过分页建议自己进行优化(这是值得推荐的,因为所有评论都表明:-))

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

于 2012-11-25T21:24:13.300 回答
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());
于 2012-10-02T23:37:32.977 回答