tutorial - what is exception in java




增加Eclipse中的堆空間:(java.lang.OutOfMemoryError) (9)

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條記錄,但它會給我一個錯誤:

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)

我知道這個錯誤是因為VM內存,但不知道如何在Eclipse中增加它?

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


如果我必須處理超過500000條記錄怎麼辦?

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


從Eclipse運行時如何為程序提供更多內存

轉到運行/運行配置。 選擇程序的運行配置。 單擊“參數”選項卡。 在“程序參數”區域中,添加-Xmx參數,例如-Xmx2048m以便為程序提供最大值。 2048 MB(2 GB)內存。

如何防止這種記憶問題

以不需要在內存中存儲如此多數據的方式重新編寫程序。 我沒有詳細查看你的代碼,但看起來你在HashMap存儲了大量數據; 當你有很多記錄時,你會記憶猶新。


在Eclipse下載文件夾中,在eclipse.ini文件中創建條目:

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

或者你想要的東西。


在Run-> Run Configuration中,找到您正在運行的類的Name,選擇它,單擊Arguments選項卡,然後添加:

-Xms512M -Xmx1524M

到VM Arguments部分



您可能希望在Project Explorer中關閉打開的項目。 您可以通過右鍵單擊打開的項目,然後選擇“關閉項目”來完成此操作。

在我注意到我必須定期增加my_directory \ eclipse \ eclipse.ini中的堆大小之後,這對我有用。

希望這可以幫助! 和平!


有時在eclipse ini文件中增加內存後異常不會停止。 然後嘗試以下選項

轉到窗口>>首選項>> MyEclipse >> Java企業項目>> Web項目>>部署選項卡下 - >在庫部署策略下取消選中 - >來自用戶庫的Jars



轉到“窗口 - >首選項 - >常規 - > C / C ++ - >代碼分析”並禁用“語法和語義錯誤 - >抽像類無法實例化”







exception-handling