如何检测jQuery中的事件泄漏或枚举jQuery中的对象';s缓存?

如何检测jQuery中的事件泄漏或枚举jQuery中的对象';s缓存?,jquery,memory-leaks,Jquery,Memory Leaks,我们似乎一直在不小心地将内存泄漏引入应用程序,因为我们正在向元素添加事件处理程序,而在从DOM中删除父元素时忘记删除它们。我意识到这是一个愚蠢的错误,一旦我们发现它就很容易修复,但是我想在代码中自动发现这个错误 最初,我认为我应该定期枚举内部jQuery缓存中的对象,并对缓存中每个对象的事件侦听器进行计数,以查找不断增加而从不减少的计数。这通常表示我们正在添加事件处理程序,而不是删除它们。我还考虑枚举缓存中的对象,以查找DOM中不再存在的所有元素,如以下旧代码所示: 这表明该对象仍然附加了事件侦

我们似乎一直在不小心地将内存泄漏引入应用程序,因为我们正在向元素添加事件处理程序,而在从DOM中删除父元素时忘记删除它们。我意识到这是一个愚蠢的错误,一旦我们发现它就很容易修复,但是我想在代码中自动发现这个错误

最初,我认为我应该定期枚举内部jQuery缓存中的对象,并对缓存中每个对象的事件侦听器进行计数,以查找不断增加而从不减少的计数。这通常表示我们正在添加事件处理程序,而不是删除它们。我还考虑枚举缓存中的对象,以查找DOM中不再存在的所有元素,如以下旧代码所示: 这表明该对象仍然附加了事件侦听器,即使它是孤立的


但是,jQuery不再能够访问$.cache,这使得此类泄漏检测变得困难。有没有一种方法我不知道呢?

你可以使用google chrome profiler查找应用程序中的内存泄漏。使用google chrome浏览器导航到您的页面。通过右键单击并检查打开检查器,然后转到配置文件并选择记录分配时间线。您将看到一个包含内存使用情况的图表。开始浏览你的页面,当你浏览你的页面时,你的内存会上下波动,如果出于某种原因,即使在离开导致内存尖峰的区域后,内存仍保持不动,那么这意味着该区域存在内存泄漏

谢谢你的回答。不幸的是,这就是我们现在检测这些泄漏的方式。不过,我正试图在代码中自动检测,因为我知道我们在犯什么错误。当元素被删除时,您不需要删除事件处理程序,它将自动完成。@Barmar,似乎有一个内部jQuery缓存,它会记住曾经添加到每个元素的所有事件侦听器。如果以jQuery不知道的方式删除元素,则该项及其事件处理程序将留在该内部缓存中,因此永远不会被GC删除。如果该处理函数恰好是一个引用其作用域中大型对象的闭包,那么我们发现我们意外地泄漏了内存,因为我们仍然在引用我们不打算引用的对象。为什么要以jQuery不知道的方式删除元素?你是不是做得太多了以至于泄漏是个真正的问题?也许你应该解决这个问题。