且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JAVA递归中的垃圾回收

更新时间:2022-10-13 11:13:05

最近在处理数据库导数据的工具,就是迭代发版之前把正式线的工程拷贝到测试环境,执行升级,看看功能是否完善。

所以涉及到对jdbc分页读取数据,再存储到测试环境数据库。在分页处理的地方,使用了递归。

工具交付给测试同事之后,大部分工程都能拷贝成功,但是有一部分大数据量的工程还是失败了,最开始的关注点都在数据库的数据上,因为比较恶心的是,数据库存了比较多的二进制字段,超级大文本。失败的现象是数据导到大表时,都会挂掉,一直跟到挂掉的MySQL记录,发现数据量并没有想象中的那么大。后来在日志角落里发现了内存泄漏,好吧,跟数据库没关系,一行一行的查代码。终于看到了递归的代码!


Java中有垃圾回收机制,理论上一个方法执行完了之后,方法内部申请的资源都会被回收,但是递归确实不一样,在整个递归结束之后,都不会释放掉中间申请占用的资源。我的场景之中,递归中查询到的源数据集合list,很大,当递归到一定的程度,必然会挂掉。其实比较简单的做法就是在递归中,对于比较声明的比较大的对象,直接置null即可,垃圾回收机制会回收这些递归中声明的变量。


即栈中存储对象的引用以及基本数据类型,堆中存储对象,引用只想堆中的对象,将引用置null,那么堆中的对象没有被引用,那么堆中申请的资源就会被回收。

直接上代码:

JAVA递归中的垃圾回收




本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/13172906/1976389,如需转载请自行联系原作者