簡體   English   中英

超出Java GC開銷限制

[英]Java GC overhead limit exceeded

我正在嘗試預處理大型txt文件(10G),並將其存儲在二進制文件中以備將來使用。 當代碼運行時,它會變慢並以

線程“主”中的異常java.lang.OutOfMemoryError:超出了GC開銷限制

輸入文件具有以下結構

200020000000008;0;2
200020000000004;0;2
200020000000002;0;2
200020000000007;1;2

這是我正在使用的代碼:

        String strLine;

        FileInputStream fstream = new FileInputStream(args[0]);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 

        //Read File Line By Line
        HMbicnt map = new HMbicnt("-1");
        ObjectOutputStream  outputStream = null;
        outputStream = new ObjectOutputStream(new FileOutputStream(args[1]));

        int sepIndex = 15;

        int sepIndex2 = 0;
        String str_i = "";
        String bb = "";
        String bbBlock = "init";

        int cnt = 0;
        lineCnt = 0;
        while ((strLine = br.readLine()) != null)   {
            //rozparsovat radek         
            str_i = strLine.substring(0, sepIndex);
            sepIndex2 = strLine.substring(sepIndex+1).indexOf(';');
            bb = strLine.substring(sepIndex+1, sepIndex+1+sepIndex2);
            cnt = Integer.parseInt(strLine.substring(sepIndex+1+sepIndex2+1));
            if(!bb.equals(bbBlock)){
                outputStream.writeObject(map);
                outputStream.flush();
                map = new HMbicnt(bb);
                map.addNew(str_i + ";" + bb, cnt);
                bbBlock = bb;
            }
            else{
                map.addNew(str_i + ";" + bb, cnt);
            }
        }
        outputStream.writeObject(map);

        //Close the input stream
        br.close();
        outputStream.writeObject(map = null);
        outputStream.close();

基本上,它遍歷in文件並將數據存儲到對象HMbicnt(這是一個哈希圖)。 一旦它在第二列中遇到新值,就應該將對象寫入輸出文件,釋放內存並繼續。

謝謝你的幫助。

我認為問題不是內存中有10G,而是您創建了太多的HashMap。 也許您可以清除HashMap而不是在不再需要它之后重新創建它。 似乎在java.lang.OutOfMemoryError中出現了類似的問題:超出了GC開銷限制 ,這也與HashMaps有關

簡而言之,您正在使用過多的內存。 如您所說,由於文件為10 GB,因此無法將其全部裝入內存(除非,除非您碰巧擁有超過10 GB的RAM並配置了Java以供使用它)。

從我的代碼和描述中可以看出,您正在將整個文件讀入內存,並在執行過程中將其添加到一個巨大的RAM映射中,然后將結果寫入輸出。 這是不可行的。 您需要重新設計代碼以就地工作(即,在任何給定時間僅將文件的一小部分保留在內存中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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