Backbonejs应用中的内存泄漏问题

9
我正在使用BackbonejsRequirejs创建单页Web应用程序。看起来我的应用程序存在内存泄漏问题。
为了进行测试,我创建了一个样本代码。它创建一个视图对象,调用其render函数,并将返回的html附加到DOM中。
返回的html有一个button。单击按钮后,它的callback调用destroy函数,视图被销毁。
然而,当我运行chrome heap profiler时,我可以看到仍然存在detached DOM tree。深入研究后,可以看到jQuery保留了references
我怀疑这是否是内存泄漏。 如果是,我的代码没有保留任何引用。 那么问题出在jQuery吗?
这里是样本代码的链接。 我还附上了堆快照的屏幕截图。
Heap snapshot 1 Heap snapshot 2 References for Detached DOM element

一般建议:在处理此类问题时,请尝试隔离每个元素:摆脱 requirejs,这样您就可以在调试时少处理一些内容。另一个建议是升级到 Backbone 1.0.0 并使用新的 listenTostopListening 函数,这些函数正是为了处理这种问题而引入的。请记住,在视图上调用 remove 也会调用 stopListening - namero999
4
@gustavohenke 的意思是 "backbone" 框架本身并没有内存泄漏的问题,这些问题是由开发者引起的 :) - Vitalii Petrychuk
如果您遇到内存问题,请开始检查所有处理程序的位置...可能会有一些处理程序被视图隐式设置,而remove无法处理。 - adrian
@amchang87请看第三张图片,你会注意到backbone没有保留任何引用,而是jQuery。 - bitsbuffer
@namero999 我并没有监听任何模型事件,只是将一些HTML附加到DOM中。我现在担心的不是模型,而是分离的DOM树,在我的原始应用程序中消耗了大量内存。 - bitsbuffer
2个回答

1

使用backbone构建的应用程序经常存在由孤立视图引起的内存泄漏问题。我通过使用marionette来管理我的视图来处理这个问题。直接使用backbone并不是一种典型的方法,因为它实际上是一个框架基础工具包。


3
实际上,Backbone 可以直接使用而无需额外的框架,并且确实被许多开发者直接使用。但是,您关于孤立视图的观点是正确的。管理孤立视图的清理应该是任何 Backbone 实现的标准流程。 - dcarson
1
我并不认为backbone适合直接使用。我在软件开发的各个方面都有相当丰富的经验,过去一年中我也亲自使用了backbone。但当我转向Marionette时,我松了一口气,并删除了一半的代码。因此,我总是会推荐使用Marionette而不是直接使用backbone。 - Software Engineer
@EngineerDollery 我曾经使用过Marionette,它为我做了出色的工作,但在这种情况下,我也正在清理我的视图,所以视图被孤立的事实就不那么重要了。现在我最担心的是泄漏DOM树。如果您看到最后一张图片,您会注意到jQuery保留了一些引用。我请求您仔细查看我的代码,它非常简单,同时也展示了我的担忧。 - bitsbuffer
@EngineerDollery 我想我应该说:许多人选择直接使用Backbone来管理内存泄漏,这是完全可能的,也有许多人选择使用一个可以为他们完成此操作的框架。归根结底,框架在幕后做着同样的事情。任何一种选择都是有效的,这取决于个人喜好,而且,那些可以为您节省大量时间的框架也许更值得选择 :) - dcarson

1

3
欢迎来到Stack Overflow。请在您的回答中概括链接的内容。这样,即使链接失效,答案也不会完全无用。 - michaelb958--GoFundMonica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接