2011-12-22 85 views
40
try { 
    // CompareRecord record = new CompareRecord(); 
    Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521"); 
    ResultSet res = null; 

    if (conn != null){ 
     Statement stmt = conn.createStatement(); 
     res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx"); 
    } 

    Map<Integer,String> adddressMap = new LinkedHashMap<Integer, String>(); 
    if (res != null){ 
     System.out.println("result set is not null "); 
     while(res.next()){ 
      adddressMap.put(res.getInt(1),res.getString(2)); 
     } 
    } 

    System.out.println("address Map size =========> "+adddressMap.size()); 
    Iterator it = adddressMap.entrySet().iterator(); 
    int count = 0; 
    int min = 0; 

    while (it.hasNext()){ 
     Map.Entry pairs = (Map.Entry)it.next(); 
     Pattern p = Pattern.compile("[,\\s]+"); 
     Integer outerkey = (Integer)pairs.getKey(); 
     String outerValue = (String)pairs.getValue(); 
     //System.out.println("outer Value ======> "+outerValue); 

     String[] outerresult = p.split(outerValue); 
     Map.Entry pairs2 = null; 
     count++; 
     List<Integer> dupList = new ArrayList<Integer>(); 

     Iterator innerit = adddressMap.entrySet().iterator(); 
     boolean first = true; 

     while (innerit.hasNext()){ 
      //System.out.println("count value ===> "+count); 
      int totmatch = 0; 
      if(first){ 
       if(count == adddressMap.size()){ 
        break; 
       } 
       for(int i=0;i<=count;i++){ 
        pairs2 = (Map.Entry)innerit.next(); 
       } 
       first = false; 
      } 
      else{ 
       pairs2 = (Map.Entry)innerit.next(); 
      } 
      Integer innterKey = (Integer)pairs2.getKey(); 
      String innerValue = (String)pairs2.getValue(); 
      //System.out.println("innrer value "+innerValue); 
      String[] innerresult = p.split(innerValue); 

      for(int j=0;j<outerresult.length;j++){ 
       for(int k=0;k<innerresult.length;k++){ 
        if(outerresult[j].equalsIgnoreCase(innerresult[k])){ 
         //System.out.println(outerresult[j]+" Match With "+innerresult[k]); 
         totmatch++; 
         break; 
        } 
       } 
      } 

      min = Math.min(outerresult.length, innerresult.length); 
      if(min != 0 && ((totmatch*100)/min) > 50) { 
       //System.out.println("maching inner key =========> "+innterKey); 
       dupList.add(innterKey); 
      } 
     } 
     //System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+" "+outerkey); 
    } 

    System.out.println("End =========> "+new Date()); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

這裏的ResultSet各地紛紛500000條記錄進行處理,但它會給我的錯誤,如:增加堆空間:(java.lang.OutOfMemoryError)

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.HashMap.resize(HashMap.java:508) 
    at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406) 
    at java.util.HashMap.put(HashMap.java:431) 
    at spite.CompareRecord.main(CompareRecord.java:91) 

我知道這個錯誤出現,因爲虛擬機內存,但不知道如何在Eclipse中增加它?

如果我必須處理超過500,000條記錄,該怎麼辦?

+1

也許你需要改變的邏輯。爲什麼你一次需要500000條記錄。 – 2011-12-22 09:14:07

+0

在幾乎所有這種情況下,您都認爲代碼需要改進是正確的,但大多數情況下這不是一個可行的短期選項,您需要立即解決。 – 2016-08-29 18:20:00

回答

127

在運行 - >運行配置發現你已經運行的類的名稱,選中它,單擊參數選項卡,然後添加:

-Xms512m -Xmx1524M

到VM參數部分

+0

其工作完美 – chetan 2011-12-22 09:27:14

+0

用Eclipse Indigo和jdk 1.6工作。 – matthewb 2012-11-05 17:03:17

+0

爲我工作與Eclipse靛藍和JDK 1.7 – Xenalin 2014-01-04 16:34:30

1

您可以通過使用命令行A的增加內存的大小rguments。

請參閱this link

eclipse -vmargs -Xmx1024m

編輯:又見see this excellent question

+1

這不行;它只會給Eclipse本身更多的內存,而不是從Eclipse內部運行它時自己的程序。 – Jesper 2011-12-22 08:17:58

7

http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-Xms和-Xmx設置堆的最小和最大尺寸。作爲一項功能,Hotspot在堆大小上設置了一個上限,以防止它吹出你的系統。因此,一旦找出了應用程序需要的最大內存,就可以限制它,以防止惡意代碼影響其他應用程序。使用這些標誌,如-Xmx512M,其中M代表MB。如果你不包含它,你指定的字節。幾個標誌使用這種格式。你也可以通過設置最小值來獲得較小的啓動性能,因爲它不必立即增加堆。

-XX:MaxPermSize = ### M設置最大的「永久代」大小。熱點是不常見的,因爲幾種類型的數據被存儲在「永久代」中,這是堆的一個單獨區域,很少(或從不)被垃圾收集。 perm-gen託管數據列表有點模糊,但通常包含類元數據,字節碼,實際字符串等等(這在不同的Hotspot版本中有所不同)。因爲這一代很少或從未收集過,所以你可能需要增加它的尺寸(或者用其他標誌打開燙髮器)。特別是在JRuby中,我們生成了很多適配器字節碼,這通常需要更多的發行版空間。

5

從Eclipse的

去跑步運行/運行配置時,如何讓你的程序更多的內存。選擇程序的運行配置。點擊標籤「參數」。在「程序參數」區域中,添加一個-Xmx參數,例如-Xmx2048m以使您的程序達到最大值。 2048 MB(2 GB)內存。

如何防止這種內存的問題

重新寫在這樣一種方式,它不需要在內存中存儲如此多的數據你的程序。我沒有仔細查看你的代碼,但是看起來你正在存儲大量的數據在HashMap;當你有很多記錄時,它們比內存更適合。

0

如果我必須處理更多的500000條記錄,該怎麼辦?

有幾種方法可以增加您的應用程序的Java堆大小,其中有幾個建議已經存在。您的應用程序需要從您的adddressMap中刪除元素,因爲您的應用程序會添加新元素,因此如果有更多記錄進入,您將不會遇到oom。如果您有興趣,請尋找生產者 - 消費者。

34

在Eclipse下載文件夾使在eclipse.ini文件中的條目:

--launcher.XXMaxPermSize 
512M 
-vmargs 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx1024m 

或什麼都值你想要的。

+0

感謝您的回答 – chetan 2011-12-22 09:27:54

+0

很好的答案,謝謝 – 2013-01-05 12:16:14

+0

完美工作。感謝 – 2014-04-23 12:37:34

0

我不是在Java親,但你的問題可以通過「blockingqueue」來解決,如果你明智地使用它。

嘗試首先檢索一大塊記錄,處理它們,然後迭代該過程,直到完成處理。這可能會幫助你擺脫OutOfMemory Exceptions

0

在Eclipse中轉到運行 - >運行配置發現你已經運行的類的名稱,選中它,單擊目標選項卡,然後在「其他仿真器命令行選項」補充:

-Xms512m -Xmx1524M

然後點擊應用。

0

轉到「窗口 - >首選項 - >常規 - > C/C++ - >代碼分析」 並禁用「語法和語義錯誤 - >抽象類不能被實例化」

1

您可能要關閉打開項目瀏覽器中的項目。您可以通過右鍵單擊打開的項目並選擇「關閉項目」來完成此操作。

在我注意到我必須定期增加my_directory \ eclipse \ eclipse.ini中的堆大小後,這就是我的工作。

希望這會有所幫助!和平!

0

在eclipse.ini文件,使下面的條目

-Xms512m

-Xmx2048m

-XX:MaxPermSize參數=1024米

相關問題