我在ColdFusion中编写了一个数据库加载脚本,我遇到了一个问题,即脚本内存缓慢耗尽。我用< cfthread>将每个表加载分成了自己的线程。当内存下降到50%以下时,我正在调用垃圾收集器(确保在gc()调用之间有30秒,以防止垃圾收集器占用内存)。
我创建了一个CFC来保存脚本所需的所有查询。该脚本调用适当的CFC函数,然后返回查询,其中一些查询大小超过2 MB。当我在活动线程的内存页面的详细信息视图中查看服务器监视器时,看起来我的CFC在内存中保留了查询的副本,即使我对查询变量进行了操作并且变量在最后超出了范围功能。另外,我在我的帖子中有一个内存查询的副本。所以我在内存中留下了两个查询副本。这真的发生了什么?如果是,我如何从内存中删除一个查询副本?
答案 0 :(得分:11)
这里有很多潜在的问题,但我会尝试强调一些最重要的事情供你考虑:
查询可能会从cfreturn语句返回指向查询的指针。在完成引用它的所有进程之前,不会清除该查询。因此,如果它将查询传递给其他进程,则不会将查询清除内存。例如,如果将该查询设置为会话变量,那么该指针在该会话变量消失之前不会移动到任何地方,无论您多久尝试强制进行垃圾收集。
只需要考虑几件事。
答案 1 :(得分:0)
我在处理大型数据插入时遇到了类似的问题,其中每一行都需要涉及多个CFC的大量处理。似乎由< cfquery>创建的JDBC ResultSet,Statement和Connection引用一直持续到请求结束。这意味着将查询变量置零不会影响内存使用量。我解决这个问题的方法是对CFC函数进行网关调用以处理100行,然后该函数对接下来的100行等进行另一个网关调用,直到处理完所有行为止。因为每个单独的网关调用实际上都会退出,所以它会释放它的所有句柄并恢复内存。