簡體   English   中英

java.lang.outofmemoryError java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM