通过页面重新加载诊断内存泄漏

Diagnosing memory leaks with page reload

本文关键字:加载 诊断 内存 泄漏 新加载      更新时间:2023-09-26

我怀疑我的一页javascript应用程序在某处包含内存泄漏。运行 Firefox 或 Chrome 的弱设备似乎最终会崩溃,如果页面保持打开状态。我正在尝试确定重新加载页面是否应该释放内存。

我知道内存处理特定于浏览器,因此答案在Chrome或Firefox中可能会有所不同。

注意:我认识到这个问题中经常提到浏览器(这将是题外话),但这个问题的重点是关于javascript调试,我认为这是非常热门的话题。

除了浏览器/扩展错误,浏览器会在不再需要资源时释放资源;Firefox 会清除隔间,Chrome 会杀死进程和相关存储。

Firefox 尽其所能,但可能需要一些时间来清除内存,并且有时可能会创建僵尸隔间:

隔间在垃圾收集时被销毁。 这发生在对它们的最后一个引用消失后的一段时间。 这意味着页面关闭和隔间消失之间可能存在延迟......

有时,由于 Firefox、附加组件 SDK 和/或附加组件中的错误,会创建永远不会被销毁的隔间。 这些是一种特殊的内存泄漏,它们会导致 Firefox 的内存使用量随着时间的推移逐渐增加,从而减慢速度并使其更容易崩溃。

Chrome 使用每个选项卡的进程(以及选项卡中某些实体以及 IIRC 的实际子流程,例如插件、iframe 等)来达到相同的效果。尽管快速检查chrome://memory-redirect/并刷新选项卡看起来与使用pid相同。因此,刷新并不是一个完全干净的石板。

FWIW Chrome 有一个"强制重新加载",可以清除缓存,并且可能对清除更多内存或安慰剂有用:cmd-shift-r

我不太熟悉内部结构,但我只看到当特定浏览器变得太聪明并在您不更改来源等时试图保留内容以提高负载性能时,在刷新之间无法可靠地释放内容。

简而言之,如果您没有看到按预期释放的内存,您可能会遇到浏览器错误,但您希望使用各种"about:memory"工具来验证这一点,此时您将避免此类行为和/或将问题报告给浏览器的开发团队。

否则,我认为最好使用各种可用的工具解决页面中自己的内存泄漏。

调试 JS 资源使用情况的一个好方法是在检查工具中使用 Firefox 性能监视器。火狐开发版有更深入的工具

在页面上按 F12 并单击检查窗口中的小速度表图标; 这将打开性能监视器。按下"开始录制"按钮,Firefox 将开始对页面上的所有脚本计时、CSS 活动、用户输入等进行基准测试。

当您觉得它已经运行了足够长的时间时,请停止录制,您将看到所有数据。顶部将是一个显示性能的图表,您可以单击任何部分并检查当时运行的所有脚本。

可在此处找到性能工具的完整教程