亲爱的大家, 我正在为我的程序使用 java rmi,从客户端我通过传递单个参数来调用我的接口(interface)方法。使用此参数接口(interface)运行查询并返回 40,000 行(每行包含 10 行)作为结果。所有这些都存储在 vector 结构 [[0,1,2,3,4,5,6,7,8 ,9],[],[],[],[],[]...]。当我单击一个按钮时,就会发生这种情况。第一次它的工作,但我再次尝试做同样的事情(即单击按钮)它显示 java.lang.out of memory exception at client side。请帮助我。我正在使用 Postgresql 数据库。
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;
}
我在完成我的过程后清除了所有 vector 和 HashMap ,但仍然在客户端抛出内存不足异常,这是在数据(查询结果 vector )分派(dispatch)到客户端时发生的。
最佳答案
直接回答您的问题:如果您可以更改客户端 JVM 命令行参数,则从分配更多内存开始。例如,使用 -Xmx256M 以使用 256 Meg 的最大内存
对您的问题更有用的回答:您表达问题的方式表明您知道真正的问题:一个程序架构试图通过一次点击获取如此多的数据。客户端真的需要这么多数据吗?你能在服务器端用它做一些处理并发送更少吗?可以加分页吗?还是延迟加载?
将 Google 的搜索模型视为一种可能的解决方案...Google 搜索“hello”大约有 310,000,000 个匹配项,但 Google 一次只向我发送 10 个结果。然后我单击“下一步”以获取更多...这是分页。用户通常无法同时理解 40,000 行数据。这对你有用吗?
如果这是为了导出,一次获取 100 行左右,导出它们,然后获取下一行......你真的不希望在一次调用中通过 RMI 传输这么多数据。
关于java - RMI 内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4177199/