9

在 Javascript 应用程序中搜索一些内存泄漏,我尝试使用 Chrome DevTools Profiler。是否有一些详细信息描述了可能在其中找到的所有条目?

例如,在执行一个简单的“打开主页,打开另一个页面,返回主页”并查看快照比较后,我可以找到对象数较大且感兴趣的行“(数组)”。打开该节点时,我看到数千行...

  • (脚本行结束)[] @89876
  • (转换数组)[] @748323
  • (对象属性)[] @77529
  • (地图描述符)[] @13823
  • (代码重定位信息)[] @722653
  • []@748003
  • (对象元素)[] @40917

我在哪里可以读到这个?

4

1 回答 1

14

堆中有许多不同的 v8 内部事物无法从 javascript 访问。

例如(脚本行结束)是一个具有脚本行结束偏移量的数组。v8 需要它来设置断点。

每次创建对象时,v8 都会做很多事情并为它们分配内存。请参阅有关 v8 的 Lars Bak 视频。http://www.youtube.com/watch?v=hWhMKalEicY

如果您对该主题感兴趣,这里有很多关于 v8 内部的幻灯片和演示文稿。

查找泄漏的最简单方法是使用“记录堆分配”配置文件。它向您显示了一个带有分配的“实时”图表。

您需要开始录制,重复您的场景几次,如果代码有泄漏,那么您将在图表上看到相同数量的蓝色垂直条。所以你应该停止录制并选择中间某处的蓝色条,看看它有什么对象。

第一个蓝条并不有趣,因为它可能只进行了一次分配。

最后一个也不有趣,因为它可能具有将在您的场景的下一次重复时释放的分配。

所以最好的候选人是中间的酒吧。http://www.youtube.com/watch?v=x9Jlu_h_Lyw

最有趣的项目是由您的脚本创建的对象。

于 2013-09-26T06:37:56.220 回答