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