簡體   English   中英

需要有關Java結果集的幫助。 堆空間不足

[英]Need help on Java Resultset. Running out of Heap Space

在以下情況下需要有效的內存管理方面的幫助。 我正在從兩個不同的數據庫中獲取數據並比較Java中的數據。(當前在具有兩個查詢的單個數據庫上進行測試)。

由於需要比較980萬條記錄,因此我每次都要復制5萬條記錄,並將其加載到ArrayList中,然后使用Binarysearch進行比較。 盡管我每次迭代后都會清除(分配為null並運行gc)陣列列表,但是在比較250萬條記錄后卻遇到了堆空間錯誤(分配1GB RAM)。

我的查詢中的內存泄漏在哪里?

Query1= select empno,ename from table1 order by empno;
Query2= select empno,ename from table2 order by empno;

ResultSet rs1 = st1.executeQuery(query1);
ResultSet rs2 = st2.executeQuery(query2);               
for (;;) {
    ArrayList<String> al = new ArrayList<String>();
    ArrayList<String> al1 = new ArrayList<String>();

    if (totalRecords1 == Ubound)
        break;

    Lbound = Ubound + 1;
    Ubound = min(Ubound + 50000, totalRecords1);
    System.out.println("Lbound : " + Lbound);
    System.out.println("Ubound : " + Ubound);

    for (int i = Lbound; i <= Ubound; i++) {
        recordConcat1 = ""; recordConcat2 = "";
        String recordConcat1 = "", recordConcat2 = "";
        rs1.next();
        rs2.next();

        recordConcat1 = recordConcat1 + rs1.getString(z) + " ǀ ";
        recordConcat2 = recordConcat2 + rs2.getString(z) + " ǀ ";

        al.add(recordConcat1);

        al1.add(recordConcat2);

    }  /* End of First Lap */ 

    System.out.println("End of Lap : "+lap++);

    int index =0;
    for(int like=0;like<al.size();like++) {

        if(Collections.binarySearch(al1,al.get(like))>=0)
            continue;
        else {
            System.out.println("Not matched : "+ al.get(like));
            break;
        }
    }

    al =null;
    al1=null;
    System.gc();

} /* End of Infinite Loop */ 

而不是將ArrayLists設置為null並調用GC。 調用ArrayList.clear()不會釋放ArrayLists的內存,但會重用它。 此外,因為您的上限固定為50000,所以應將該數字傳遞給ArrayList的構造函數,以避免動態分配內存,同時自動將ArrayLists從其默認初始大小10增加。

另一方面,如果我沒看錯的話,您要達到的目的是告訴一個表中的每個元素是否都在另一個表中。 由於對數據進行了排序,因此您可以執行以下操作,而無需將塊加載到內存中,而是並行讀取兩個ResultSet。

我認為即使沒有內存不足錯誤,您的算法也無法正常工作。 您從表A中讀取了50K,從表B中讀取了50K。現在在塊A上搜索塊B的每個元素。但是,如果B的前50000中的元素位於A的位置50001,會怎樣呢?它是。 對?

暫無
暫無

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

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