RMI中的内存不足异常

时间:2010-11-14 11:06:10

标签: java postgresql rmi

亲爱的, 我正在使用java rmi作为我的程序,从客户端我通过传递单个参数调用我的接口方法。使用此参数接口运行查询并返回40,000行(每行包含10行)。所有这些都存储在向量结构中的向量[[0,​​1,2,3,5,5,7,8]中,9],[],[],[],[],[] ...]。当我点击一个按钮时会发生这种情况。第一次它的工作,但我再次尝试做同样的(即点击按钮)它显示客户端的内存异常的java.lang.out 。请帮帮我。我正在使用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;
       }

我在完成我的进程后清除了所有的向量和hashmap,但仍然在客户端丢失了内存异常,当数据(查询结果向量)发送到客户端时会发生这种情况。

2 个答案:

答案 0 :(得分:1)

对您的问题的直接回复:如果您可以更改客户端JVM命令行参数,则从分配更多内存开始。例如,使用-Xmx256M使用256 Meg

的最大内存

对您的问题的一个更有用的回答:你提出问题的方式表明你知道真正的问题:一个程序架构试图通过一次点击获得如此多的数据。你真的需要在客户端有这么多的数据吗?你可以在服务器端进行一些处理并发送少得多吗?你能添加分页吗?还是懒加载?

将Google的搜索模型视为可能的解决方案......谷歌搜索“hello”有大约310,000,000个匹配,但Google一次只向我发送10个结果。然后我点击“下一步”获取更多...这是分页。用户通常不能同时理解40,000行数据。这对你有用吗?

如果这是用于导出,一次获取100行左右,导出它们,然后获取下一行......你真的不希望在一次调用中通过RMI传输这么多数据。

答案 1 :(得分:0)

尝试重用data,不要在每个请求上创建新的向量。 data.clear(); // fill it then