簡體   English   中英

RMI中的內存不足異常

[英]out of memory exception in RMI

親愛的所有人,我在程序中使用java rmi,從客戶端通過傳遞單個參數來調用接口方法。 使用此參數接口運行查詢並返回40,000行(每行包含10行)。所有這些都存儲在vector結構[[0,1,2,3,4,5,6,7,8中,9],[],[],[],[],[] ...]。 當我單擊一個按鈕時,會發生這種事情。 第一次工作,但是我再次嘗試做同樣的事情(即單擊按鈕)。它在客戶端顯示java.lang.out of memory exception 請幫助我。我正在使用Postgresql db。

Client side:
    Vector data = new Vector();
    data = Inter.getEndProductDetailsForCopyChain(endProductId);

Server side:
    public Vector getEndProductDetailsForCopyChain(int endProductId1)
    {
        Connection OPConnect  = StreamLineConnection.GetStreamline_Connection();
        Vector data=new Vector();       
        try{        
            System.out.println("Before query data vector size>>>>>>>>"+data.size());//mohan
            String sqlQry = "select distinct style_no,version_no,matNo,type,specs,color,size,ref_no,uom1 from garment where id=" +endProductId1;
            System.out.println("sqlQry"+ sqlQry);
            Statement st=OPConnect.createStatement();
            ResultSet rs = st.executeQuery(sqlQry);
            while(rs.next()){
                Vector row = new Vector();
                row.add(rs.getString("style_no"));
                row.add(rs.getString("version_no"));
                row.add(rs.getString("matNo"));
                row.add(rs.getString("type"));
                row.add(rs.getString("specs"));
                row.add(rs.getString("color"));
                row.add(rs.getString("size"));
                row.add(rs.getString("ref_no"));
                row.add(rs.getString("uom1"));
                row.add(new Boolean(false));
                data.add(row);
                }
            System.out.println("After query data vector size>>>>>>>>"+data.size());
        }catch(Exception e)
        {    e.printStackTrace();
             closeConnection(OPConnect);
        }
            return data;
       }

在完成我的過程之后,我清除了所有向量和哈希圖,但仍然在客戶端拋出內存不足異常,這是在將數據(查詢結果向量)調度到客戶端時發生的。

對您的問題的直接回答:如果可以更改客戶端JVM命令行args,則從分配的更多內存開始。 例如,使用-Xmx256M可使用256 Meg的最大內存

對您的問題的更有用的回答:問題表達方式表明您知道真正的問題:一種程序體系結構,單擊即可嘗試獲取大量數據。 您是否真的需要在客戶端擁有如此多的數據? 您可以在服務器端對其進行一些處理並減少發送嗎? 您可以添加分頁嗎? 或延遲加載?

考慮將Google的搜索模型作為一種可能的解決方案...在Google搜索“ hello”中大約有310,000,000個匹配項,但是Google一次只向我發送10條結果。 然后,我單擊“下一步”以獲取更多...這是分頁。 用戶通常一次無法理解40,000行數據。 這對您有用嗎?

如果要導出,則一次獲取100個左右的行,將其導出,然后獲取下一行...您真的不想在一個調用中通過RMI傳輸這么多數據。

嘗試重用data ,不要在每個請求上都創建新的向量。 data.clear(); // fill it then data.clear(); // fill it then

暫無
暫無

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

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