从数据库读取数据生成Domcument对象。发生内存溢出错误? DOM 就是将整个文件保存在内存中,如果数据量比较大应该使用SAX 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我要在内存中创建一个非常大的dom对象,然后把它保存到文件中,可是在生成dom对象的一个大元素时,报告内存溢出,而实际内存剩余超过1G,而且查询的行数最大时只有1000万,到底为什么? sax能保存文件吗?分多次好像不太适合我现在的情况。而且内存是足够大的,是不是java虚拟机不能管理太大的内存?担心中。 看看在你转换的过程中是否用到了Vector之类的对象 哪位知道OutOfMemoryError这个错误何时会出现,出现的理由是什么? SAX 可以一边解析,一边保存 如何保存,请详细说明!Thank You!!!!! 你存放到数据库里的是什么?整个XML文件? 我是从数据库中读取大量的数据,生成一个DOM对象,对一些属性设置后,保存成XML文档,小数据量时没有问题,数据量达到了1000万,才生成不到100000就报内存溢出的错误。实在不明白。请指教。 我觉得是 生成dom对象是内存溢出,我以前对一个32M的xml检索检索方式 10000万条数据符合的条件10条 100000万条数据符合的条件100条 Sax 检索 1078毫秒(cpu 97%,内存 :基本不变) 10265毫秒 (cpu 100%,内存 :基本不变)Dom检索 5297毫秒(cpu 100%,内存 :基本不变) java.lang.OutOfMemoryError我在dom检索是也是先生成一个dom对象的当然我的机器是256m PIV 1.7G,要不把source贴出来 让大家看看有没有可以优化de你也可以把内存打印出来看看 Runtime.getRuntime().totalMemory() /** * 填充元素EntitlementQueryReport<br/> * 这里不用了解具体数据库结构,用指定的SQL,按顺序传进指定参数得到结果集<br/> * * @param report */ public void WriteReportElement(Element report) { Element child = null; Open(); //打开数据库 try { this.pst = cn.prepareStatement(SmsService.sysPara.getQuerySQL(). getEntitlementSQL()); pst.setQueryTimeout(0); pst.setString(1, this.getStartDateTime().toString()); pst.setString(2, this.getEndDateTime().toString()); ResultSet rs = pst.executeQuery(); int j = 0; String tmp = null; ResultSetMetaData rsmd = rs.getMetaData(); while(rs.next()) { //将rs的全部字段的值作为属性插入到与元素中 try { child = doc.createElement("ICCard"); System.out.println(j++); for(int i = 1; i <= rsmd.getColumnCount(); i++) { try { try { tmp = rs.getObject(i).toString(); } catch(OutOfMemoryError e) {e.printStackTrace(System.out); System.out.println(e.getMessage()); } //将ICCardID和CASID从十进制数值转换成16进制字符串 tmp = ValueFilter(rsmd.getColumnName(i), tmp); } catch(NullPointerException e) { //保证不会将NULL值付给元素的属性 tmp = ""; } child.setAttribute(rsmd.getColumnName(i), tmp); } } catch(OutOfMemoryError e) { e.printStackTrace(System.out); System.out.println(e.getMessage()); } report.appendChild(child); } } catch(SQLException e) { Debug.Println("生成EntitlementReport发生数据库异常"); Debug.PrintErr(e); } catch(OutOfMemoryError e) { e.printStackTrace(); System.out.println(e.getMessage()); //System.out.println(e.getStackTrace().toString() ); } finally { Close(); //关闭数据库 } } 先看看你的e.printStackTrace();打出来的exception 的内存溢出看看在那个方法 里要不把这2个方法注释依次调试看看tmp = ValueFilter(rsmd.getColumnName(i), tmp);report.appendChild(child); e.printStackTrace()打印出来是OutOfMemoryError就在WriteReportElement方法中 注释tmp = ValueFilter(rsmd.getColumnName(i), tmp);后只是延缓了报错的时间 我写Excel文件,超过10000多条记录时,也出现这种问题,正不知如何解决 大家帮我看看Eclipse插件打包的问题 java中关于数据插入语句 java设计实现日历计算程序 windows下JDK的配置有多少版本? 菜鸟求助 一年经验java期望薪水应该要多少 ??????? 问一个有关public的问题 请教一个小程序 (急) 请教二进制数的表示法 谁知道为什么我的TextPad中没有编译Java、运行Application、运行Applet这三个选项???? alphazhao(绿色咖啡) 请进来,有个问题请教! [求助]一个菜鸟的问题
实在不明白。
请指教。
检索方式 10000万条数据符合的条件10条 100000万条数据符合的条件100条
Sax 检索 1078毫秒(cpu 97%,内存 :基本不变) 10265毫秒 (cpu 100%,内存 :基本不变)
Dom检索 5297毫秒(cpu 100%,内存 :基本不变) java.lang.OutOfMemoryError
我在dom检索是也是先生成一个dom对象的
当然我的机器是256m PIV 1.7G,要不把source贴出来 让大家看看有没有可以优化de
你也可以把内存打印出来看看 Runtime.getRuntime().totalMemory()
* 填充元素EntitlementQueryReport<br/>
* 这里不用了解具体数据库结构,用指定的SQL,按顺序传进指定参数得到结果集<br/>
*
* @param report
*/
public void WriteReportElement(Element report)
{
Element child = null;
Open(); //打开数据库
try
{
this.pst = cn.prepareStatement(SmsService.sysPara.getQuerySQL().
getEntitlementSQL());
pst.setQueryTimeout(0);
pst.setString(1, this.getStartDateTime().toString());
pst.setString(2, this.getEndDateTime().toString());
ResultSet rs = pst.executeQuery();
int j = 0;
String tmp = null;
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next())
{ //将rs的全部字段的值作为属性插入到与元素中
try
{
child = doc.createElement("ICCard");
System.out.println(j++);
for(int i = 1; i <= rsmd.getColumnCount(); i++)
{ try
{
try
{
tmp = rs.getObject(i).toString();
}
catch(OutOfMemoryError e)
{e.printStackTrace(System.out);
System.out.println(e.getMessage());
}
//将ICCardID和CASID从十进制数值转换成16进制字符串
tmp = ValueFilter(rsmd.getColumnName(i), tmp);
}
catch(NullPointerException e)
{ //保证不会将NULL值付给元素的属性
tmp = "";
}
child.setAttribute(rsmd.getColumnName(i), tmp);
}
}
catch(OutOfMemoryError e)
{
e.printStackTrace(System.out);
System.out.println(e.getMessage());
}
report.appendChild(child); }
}
catch(SQLException e)
{
Debug.Println("生成EntitlementReport发生数据库异常");
Debug.PrintErr(e);
}
catch(OutOfMemoryError e)
{
e.printStackTrace();
System.out.println(e.getMessage());
//System.out.println(e.getStackTrace().toString() );
}
finally
{
Close(); //关闭数据库
}
}
要不
把这2个方法注释依次调试看看
tmp = ValueFilter(rsmd.getColumnName(i), tmp);report.appendChild(child);