2017-06-06 87 views
1

這裏是我的代碼拋出java.lang.OutOfMemoryError: Java heap space如何通過StringBuilder避免Java OutofMemoryError堆空間循環?

StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i< ranks.size(); i++) { 
     Map<String, String> map = ranks.get(i); 
     sb.append("SELECT "); 
     int iter = 0; 
     for (String key : map.keySet()) { 
      if (key.equals("ware_md5")) { 
       sb.append("'").append(map.get(key)).append(" ' AS ").append(key); 
      } 
      else { 
       sb.append(map.get(key)).append(" AS ").append(key); 
      } 
      if (iter < map.keySet().size() - 1) { 
       sb.append(","); 
      } 
      iter++; 
     } 
     if (i < ranks.size() - 1) { 
      sb.append(" UNION ALL "); 
     } 

    } 
    return sb.toString(); 

「居」 ArrayList包含約30000個值

有什麼方法重寫代碼的這一和平來避免這個錯誤?

+0

你打算怎麼做一個字符串這麼大?也許你應該直接寫一個文件? map.keySet()的大小是多少? – 9000

+0

這裏我試圖生成某種類型的SQL請求,map.keySet()的大小約爲220條記錄 –

+1

即使解決了內存問題,也可能遇到多個問題。 1個大的查詢,數據庫可能無法處理。大量的性能將成爲數據庫服務器以及返回行數的重要組合。我會建議少做但多做的方法 –

回答

4

用更大的堆啓動JVM。以java -Xmx256M爲例,一個256MB堆的例子。

1
  • 更多的內存是最簡單的解決方案,已經給
  • new StringBuilder(100_000) - 至少快
  • AS key不需要但第工會。
  • 請注意,SortedMap是你所需要的:鑰匙總是以相同的順序。
  • 消耗ranks.get(i)