项目中遇到OutOfMemoryError 程序改了好几次了,真不知道是怎么回事
项目框架是 struts2+spring2+hibernate3
这段代码是为了实现查处符合条件的数据,并进行一定的组装,然后在导出到txt文件。数据只有上百条就抛错了,真郁闷。不知道跟框架是否有关
本来我是先查处所有数据在进行判断重组导出的,现在尽然一条条的查处还是抛错// 数据导出到TXT文件!
public String findBankDataFromChaobiaoJiluByBankType(String bankType) throws ParseException
{
double tmoney = 0;
double tgas = 0;
double bcbd = 0;
double scbd = 0;
int num = 0; String bankCode = getBankcode(bankType);
List<String> cbjlYqzhs = findAllExpCbjlIdsByBankType(bankCode); BankDataUtil bankDataUtil = new BankDataUtil();
bankDataUtil.createFile(); StringBuffer bf = new StringBuffer();
bf.append("from ChaobiaoJilu ");
bf.append("where yongqidizhi.yqdzFklx='" + SystemConstant.KEHU_FKLX_YHDK_DM + "' ");
bf.append("and yongqidizhi.yqdzYhh='" + bankCode + "' ");
bf.append("and cbjlZt='" + SystemConstant.KEHU_SFZT_WJ_DM + "' ");
bf.append("and cbjlYje >0 ");
for (String yqzh : cbjlYqzhs)
{
StringBuffer cjbjBf = new StringBuffer();
cjbjBf.append(bf);
cjbjBf.append("and cbjlYqzh='" + yqzh + "'");
List<ChaobiaoJilu> cjs = chaobiaoJiluDAO.getHibernateSession().createQuery(cjbjBf.toString()).list();
ChaobiaoJilu expCbjl = null;
if (cjs.size() == 1)
{
expCbjl = cjs.get(0);
bankDataUtil.exportBankDataToTxtByBankType(bankType, expCbjl, num);
} else
{
expCbjl = cjs.get(0);
for (int i = 1; i < cjs.size(); i++)
{
expCbjl.setCbjlYje(expCbjl.getCbjlYje() + cjs.get(i).getCbjlYje());
expCbjl.setCbjlBcbd(expCbjl.getCbjlBcbd() + cjs.get(i).getCbjlBcbd());
expCbjl.setCbjlBcbdDecimal(expCbjl.getCbjlBcbdDecimal() + cjs.get(i).getCbjlBcbdDecimal());
expCbjl.setCbjlScbd(expCbjl.getCbjlScbd() + cjs.get(i).getCbjlScbd());
expCbjl.setCbjlScbdDecimal(expCbjl.getCbjlScbdDecimal() + cjs.get(i).getCbjlScbdDecimal());
}
bankDataUtil.exportBankDataToTxtByBankType(bankType, expCbjl, num);
}
for (ChaobiaoJilu cj : cjs)
{
cj.setCbjlZt(SystemConstant.KEHU_SFZT_JFDQS_DM);
chaobiaoJiluDAO.update(cj);
}

tmoney += expCbjl.getCbjlYje();
bcbd = Double.parseDouble(String.valueOf(expCbjl.getCbjlBcbd()) + "." + String.valueOf(expCbjl.getCbjlBcbdDecimal()));
scbd = Double.parseDouble(String.valueOf(expCbjl.getCbjlScbd()) + "." + String.valueOf(expCbjl.getCbjlScbdDecimal()));
tgas += (bcbd - scbd);
++num;
}
String str = "总笔数:" + cbjlYqzhs.size() + "   " + "总金额:" + tmoney + "   " + "总用气量:" + tgas + "   " + "导出时间:" + MyDateUtil.dateFormat(new Date());
return str;
}
=============
private List<String> findAllExpCbjlIdsByBankType(String bankCode)
{
// 按用气证号查处要导出的记录
StringBuffer yqzhBf = new StringBuffer();
yqzhBf.append("select distinct cbjlYqzh from ChaobiaoJilu ");
yqzhBf.append("where yongqidizhi.yqdzFklx='" + SystemConstant.KEHU_FKLX_YHDK_DM + "' ");
yqzhBf.append("and yongqidizhi.yqdzYhh='" + bankCode + "' ");
yqzhBf.append("and cbjlZt='" + SystemConstant.KEHU_SFZT_WJ_DM + "' ");
yqzhBf.append("and cbjlYje >0");
Query yqzhQuery = chaobiaoJiluDAO.getHibernateSession().createQuery(yqzhBf.toString());
return yqzhQuery.list();
}
==================抛异常的地方
List<ChaobiaoJilu> cjs = chaobiaoJiluDAO.getHibernateSession().createQuery(cjbjBf.toString()).list();

解决方案 »

  1.   

    你设置的tomcat的默认内存是多少?不会你没有修改内存配置吧?
    Tomcat启动内存参数修改
      

  2.   

    OutOfMemoryError上次遇到这个时重启了下myeclipse就好了(不知道楼主用的是什么开发工具)
      

  3.   

    hibernate托管的po数量太多了,在关键地方要控制下,清理session或者close session,
    不要保留引用,让对象托管后尽快释放。
      

  4.   


    我的tomcat1.6总咋没有
    set JAVA_OPTS= -Xms256m -Xmx256m -XX:MaxPermSize=64m   呢~?
      

  5.   

    你的代码有封装,而且好长,又乱,所以
    最简单的尝试,就是一个hibernate session不要查太多东西,查一次或几次后可以close下。再创建新的。
    chaobiaoJiluDAO.getHibernateSession()
    用完了,close它。或者清空,不知道有没有clear,几个月不用有点忘了,
    以前用hibernate创数100万条,就是不断的close,才行的,否则内存再大也没用啊。
      

  6.   

    貌似你们的哪个人很牛x,有点鄙视他,一句话就打发你了。
    getHibernateSession().clear()
      

  7.   


    sorry糊涂了,我加上去试试
      

  8.   

    先别改,会导致内存大量占用托慢系统的。
    把问题解决后在改
    使用完对象后
    getHibernateSession().clear()
      

  9.   

    我加了set JAVA_OPTS= -Xms512m -Xmx512m -XX:MaxPermSize=64m  
    1G的存
    还是不行呢,跑到300多条数据的时候机子就变慢了,还是挂了
      

  10.   

    应该就是Hibernate的问题,我记得在Hibernate的官方帮助文档里有介绍,一般在批量更新时会发生这个错误