需求是定时执行一个程序,每隔一段时间查询数据库,结果存在List中,然后将整个List写入文件,发现随着一次次的执行程序,内存越来越多,造成内存泄露。感觉这种方式是在虚拟机上执行程序时,GC似乎没回收内存,或者是没来得及回收,请大家说一说是怎么回事儿。
另外有没有其它方式,实现这种功能,最好是能每次执行完都退出本次的虚拟机,等下次执行的时候再重启虚拟机。
不知道说的明不明白,谢谢大家了

解决方案 »

  1.   

    楼主每次写文件结束的时候,有没有关闭IO工作流?
    io.close();还有你的list当写完一次文件后,可以试着clear()一下
      

  2.   


    谢谢,该关的关,IO都关了,清指清什么,我觉得之所以内存逐渐变大,是因为创建的对象一直没有被回收。以前出现内存泄露的情况JVM的最大内存是128M。现在我把程序运行时的JVM初始内存和最大内存都设成800M,程序随着执行次数的增加,javaw.exe占用的内存会增加到800M多一些,然后以后就停在这个位置了,观察一段时间,没发现内存溢出。但如果单独执行一次程序的话需要的内存大概只需要100多M,能不能有什么方式,能让它一直维持在100多M的样子。
    谢谢,你说的方式可行,但我觉得Java应该能满足我的需求,只是想了解这个知识点,觉得挺费解的现象
      

  3.   

    现在每写一次文件,我clear一次List,结果没变化
      

  4.   

    我是楼主
    我要补充一下,具体数据量的大小,最终往文件里写的数据结构是这样的List<List<Object>>,Object是一个拥有20个属性的对象,里层List是size是12,外层List的size是4000,数据量挺大的,供大家参考,谢谢
      

  5.   

    楼主,运行jconsole来监视你的javaw进程的内存占用,
    不要看win的资源管理器,那里面是虚假信息
    PS:jconsole是jdk自带工具,直接运行就可以