最近在处理数据库导数据的工具,就是迭代发版之前把正式线的工程拷贝到测试环境,执行升级,看看功能是否完善。
所以涉及到对jdbc分页读取数据,再存储到测试环境数据库。在分页处理的地方,使用了递归。
工具交付给测试同事之后,大部分工程都能拷贝成功,但是有一部分大数据量的工程还是失败了,最开始的关注点都在数据库的数据上,因为比较恶心的是,数据库存了比较多的二进制字段,超级大文本。失败的现象是数据导到大表时,都会挂掉,一直跟到挂掉的MySQL记录,发现数据量并没有想象中的那么大。后来在日志角落里发现了内存泄漏,好吧,跟数据库没关系,一行一行的查代码。终于看到了递归的代码!
Java中有垃圾回收机制,理论上一个方法执行完了之后,方法内部申请的资源都会被回收,但是递归确实不一样,在整个递归结束之后,都不会释放掉中间申请占用的资源。我的场景之中,递归中查询到的源数据集合list,很大,当递归到一定的程度,必然会挂掉。其实比较简单的做法就是在递归中,对于比较声明的比较大的对象,直接置null即可,垃圾回收机制会回收这些递归中声明的变量。
即栈中存储对象的引用以及基本数据类型,堆中存储对象,引用只想堆中的对象,将引用置null,那么堆中的对象没有被引用,那么堆中申请的资源就会被回收。
直接上代码:
原文地址:http://13172906.blog.51cto.com/13162906/1976389