为了庆贺自由伟大的美利坚冲过6000万,写了个小工具,然后遇到了很郁闷的事。

程序用来收集十几个服务器的日志,所以处理频率很高,运行几分钟就发现内存泄露很严重。

我仔细检查了代码,还真没发现有什么毛病,因为我本身比较谨慎,写代码属于比较严谨的人,以前写的程序处理几亿条数据也没泄露的,所以这次真纳闷了。

把checkmem干起来,大概看出端倪了,继而人工检查,最终推测出是tstringlist的锅。

原因是一个function的返回类型是tstringlist,我看了代码还真没问题,但是这个情况还没法弄。因为如果在过程中的话可以手工释放,但是作为返回值那就没法手工释放了。

最终改为procedure,传一个tstringlist进来,而procedure本身不创建,这样就解决问题了。

 

虽然找到了解决办法,但仍然有些不理解,按道理说delphi的垃圾回收是做的最好的,而且这是一个function,怎么说都应该能自动回收才对,奇怪。

作者 听涛

发表评论

您的电子邮箱地址不会被公开。