Javascript 是否担心潜在的内存泄漏

Javascript 是否担心潜在的内存泄漏,javascript,angularjs,performance,memory-leaks,Javascript,Angularjs,Performance,Memory Leaks,我正在构建一个用于将HTML表转换为类似excel的工作表的应用程序。我一直在担心性能,也一直在运行一些测试,我很好奇下面的配置文件是否是我需要担心的。请参阅下面的内存配置文件 要获得此配置文件,我需要“滚动”表格中的行(,单击顶行,按住箭头向下键)。该示例包含5行,而图形的列表要长得多:300行。滚动到列表中间后,我会暂停,强制进行垃圾收集,然后继续滚动到最后 简言之,每次下移到下一行时,都会创建一组输入元素,并将一些AngularJS内容(一个新范围,一些观察者)连接到它们。对于要转换回普通

我正在构建一个用于将HTML表转换为类似excel的工作表的应用程序。我一直在担心性能,也一直在运行一些测试,我很好奇下面的配置文件是否是我需要担心的。请参阅下面的内存配置文件

要获得此配置文件,我需要“滚动”表格中的行(,单击顶行,按住箭头向下键)。该示例包含5行,而图形的列表要长得多:300行。滚动到列表中间后,我会暂停,强制进行垃圾收集,然后继续滚动到最后

简言之,每次下移到下一行时,都会创建一组输入元素,并将一些AngularJS内容(一个新范围,一些观察者)连接到它们。对于要转换回普通表行元素的行,则执行相反的操作(当然,如果有泄漏,则应该在这里)

关于内存:我想,直观地说,如果实现得很好,那么将
tr
元素转换为可编辑行状态的内存在该行转换回其原始状态(即:静态
tr
状态)后应该被释放

分析图表,有两件事吸引了我的注意力

  • 你可以清楚地看到一个攀爬锯齿状的图案,它是。一堆东西正在被释放,但不是全部。=>在表行中转换时,内容正在泄漏
  • 然而,当强制执行GC时,一切都消失了。所以它毕竟不是内存泄漏,因为如果是的话,它现在不会消失。注意:好吧,我不能简单地分析锯齿阶段积累了什么,因为做快照会强制执行GC,这显然会清除我们在这里看到的所有内容
因此,我的问题是:

  • 由于强制GC将其清除,因此它不是泄漏(?)。但直观地看,它应该在行转换后被释放:它是在幕后做复杂的事情,还是暗示了错误的代码(我可以在每次转换后重写这些东西以提升更完整的GC吗?)
  • 我甚至应该担心在锯齿阶段上升的所有东西,因为它在强制GC之后被清理
[编辑] 如果您想签出代码,可以这样做。大部分肉都在里面

  • table-editor-cell.directive.js
  • table-editor-row.directive.js
  • table-editor.directive.js

我不太熟悉V8的内部工作原理,但您显示的图形让我想起了编写糟糕的数据结构或DOM交互。您是否在不删除元素的情况下将元素的allot插入DOM?我担心的不是堆,而是更多的侦听器。那一点也不下降。我觉得你把听众放得太高了。。但是如果没有看到任何代码,就很难说出来。@Keith实际上,非常欢迎你来看看。我将不胜感激。是的,这是肉的所在,AngularJS不是我的事,但看看代码-<代码>$(窗口)。on('click'),我找不到任何关于此的
关闭
,它是否被多次调用?,…
element.on('click')和element.on('keydown'
元素是否在滚动过程中被取消引用。IOW:我会尝试查看这些侦听器何时以及是否被删除。@Keith我以前就考虑过这一点。Long AngularJS under the hood故事简短:每个HTML表只调用一次
构造函数
链接
函数(请参见在debugger中添加断点),所以这不应该是问题所在。问题归结为:为了分析内存/侦听器,我应该拍一张快照,=>它消失了。例如:它与GC一起消失了,所以它真的是泄漏吗?似乎GC没有(完全)触发