Javascript 主干收集垃圾收集被jquery ajax回调停止

Javascript 主干收集垃圾收集被jquery ajax回调停止,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我一直在使用Chrome堆分析器和一些基本的主干对象来了解垃圾收集的概念。我遇到了一些奇怪和困惑的行为 使用只加载jquery-1.7.2、下划线-1.3.3和主干-0.9.2的基页。 如果我从Chrome win/19 js控制台窗口运行以下代码,则不会对收集进行垃圾收集。在heap profiler中,“Object's retaining tree”将列出50个用户以及模型和集合之间的循环引用,但它也将列出在function@234234中表示b的2个用户。扩展这些引用—这些引用看起来来自

我一直在使用Chrome堆分析器和一些基本的主干对象来了解垃圾收集的概念。我遇到了一些奇怪和困惑的行为

使用只加载jquery-1.7.2、下划线-1.3.3和主干-0.9.2的基页。 如果我从Chrome win/19 js控制台窗口运行以下代码,则不会对收集进行垃圾收集。在heap profiler中,“Object's retaining tree”将列出50个用户以及模型和集合之间的循环引用,但它也将列出在function@234234中表示b的2个用户。扩展这些引用—这些引用看起来来自jQuery的ajax回调处理程序

(function () {
    var collection = new Backbone.Collection();
    collection.url = '/api/users/';
    collection.fetch();

    setTimeout(function wtf() { $('#content').append($('<div>' + collection.models[0].get('name') + '</div>')); }, 3000);
})()
如果我运行以下代码,收集将按预期正确地进行垃圾收集。不同之处在于最后一行,我进行了一些随机的ajax调用,似乎将jQueryAjax回调从集合中移开

(function () {
    var collection = new Backbone.Collection();
    collection.url = '/api/users/';
    collection.fetch();

    setTimeout(function wtf() { $('#content').append($('<div>' + collection.models[0].get('name') + '</div>')); }, 3000);

    $.ajax({ url: '/api/users/' });
})()
这是预期的行为还是一个bug还是什么?如果我周围有随机对象,那就糟糕了,因为它们在过去做过ajax请求

更新:所以我进一步测试了它,它似乎只影响第一个或第二个实例。如果我创建一个setinterval来创建一个新集合并每1秒调用fetch,那么创建的前1-2个实例将无限期地保留在内存中20分钟以上,而创建的所有其他实例将被正确地释放

如果调用jquerys Ajax函数并在成功处理程序中将数据作为参数在创建时传递给新集合,则根本不会发生这种行为。已正确清理创建的所有实例


看来,函数Backbone.wraperor与包装成功一起也是问题的一部分

我无法具体回答您的问题,但我会指出Chrome内存分析器可能会误导您。铬有一个。。。高级垃圾收集器,并且它并不总是在一轮垃圾收集中收集您希望它收集的所有内容。相反,至少在某些情况下是这样;不确定这些是什么,它将在第1轮收集一些东西,然后在第2轮或第3轮甚至第4轮收集其余的东西。我建议在使用分析器时记住这一点。我也在其他地方读到过。当您使用时间线视图时,该视图是一个强制它进行垃圾收集的按钮。在过去的几天里,我点击了很多按钮:它也显示了对象被保留,因为有一个对它的引用。如果我进行第二次ajax调用,引用将被删除,并正确地进行垃圾收集。