Angular.js 内存泄漏,我什么时候应该开始担心

2024-01-03

所以我有一个相当大的应用程序构建在角度上,有很多嵌套状态,很多指令,数据表和东西。

我们最近决定切换到完整的单页,而不是只有几个小的单一应用程序部分(比如文章、人员、仪表板以前都是一个小的单页应用程序),所以我开始更多地处理性能。在 Chrome 中,你不会在视觉上注意到任何东西,而在 Firefox 中,我认为随着时间的推移,它会变得更慢。

所以我开始使用三快照技术来看看发生了什么。但我不完全确定该怎么做。

IMAGE https://i.stack.imgur.com/wwa5C.png enter image description here

  • 快照大小将每个快照的大小加倍(第一个 15mb、第二个 67mb、第三个 120mb),这意味着什么吗?
  • 有很多红色 dom,例如 4000 个红色 div

现在我觉得那些红色的div、spans和anchor主要是我的错,我正在做一些不那么常见的事情来渲染这些数据表,使用我制作的这个指令,而且我还觉得一些堆对象是结果那些 dom 元素没有被正确删除。

这就是 table 指令的本质作用

var rows = '<div class="row" ng-repeat="item in items">';

_.each(columns, function(column) {
   // pass cell as a string from $templateCache, instead of having <table-cell type="column.type"> which loaded correct templateUrl depending on what was passed via type attr
   var cellTemplate = $templateCache.get(column.type);
   rows += '<div class="column">' + cellTemplate  + '</div>';
});

rows += '</div>';

// el is from directive link function
el.html(rows);

$compile(el.contents())(scope);

我这样做的原因是因为当我尝试使用嵌套时ng-repeat对于行和列以及<table-cell>对于单元格指令,渲染花费的时间太长,即使只有大约 6 列和 50 行。

所以我认为正在发生的事情是,该表中的所有 div 都没有被正确删除,因此每次加载该表指令时它们都会不断堆积。

现在即使我处理那个分离的 dom 树..所有其他东西怎么样,我怎么知道我应该尝试和处理哪些,以及哪些对于角度来说是常见的并且不会真正影响性能?

// 在 plunker 上编辑表指令http://plnkr.co/edit/1fZi6mVn2jBIGF0Q2a40?p=preview http://plnkr.co/edit/1fZi6mVn2jBIGF0Q2a40?p=preview


泄漏实际上是由另一个看起来完全无害的指令引起的,该指令在表头中使用,除了创建“排序项”数组然后使用 ng-repeat 打印它之外什么也没做。这不是由我在该指令中所做的任何事情引起的,而是由它的 replace: true.. 天知道为什么,我将尝试在 plunker 上重现它并在 github 上报告。

由于仅通过查看堆报告几乎不可能找到应用程序的哪一部分导致了它,因此我继续删除了应用程序的所有其他部分,但我怀疑是导致它的部分,然后我发现它不是'没有那个,所以我继续阅读所有其他的。

一旦我发现了真正有问题的指令,我就做了同样的事情,不断删除其部分代码,直到里面什么都没有。

然后很明显这是指令的选项之一,然后我发现替换是导致它的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular.js 内存泄漏,我什么时候应该开始担心 的相关文章

随机推荐

  • VBA VS. VSTO有什么区别,我应该升级吗?

    我是 KISS 原则 保持简单 的忠实粉丝 并且是 excel VBA 的长期用户 然而 我能找到的所有关于 VBA 与 VSTO Visual Studio Tools for Office 的文章似乎都非常复杂 首先 我厌倦了 Exce
  • 在 Python 中使用多个参数进行字符串格式化(例如“%s ... %s”)

    我有一个看起来像这样的字符串 s in s 我想知道如何分离参数 使它们成为两个不同的 s 我的想法来自于 Java s in s unicode self author unicode self publication 但这不起作用 那么
  • 添加图例来指示形状

    需要一些帮助来为图中使用的形状添加图例 如下所述 该图如下 它是一个箱形图 表示平均值的点 表示置信区间的误差线 结果图如下 我如何添加一个图例来告诉red circles表明mean和green error bars表明confidenc
  • 有没有办法按两个字段对 Jekyll 中的列表进行排序?

    有没有办法使用 Jekyll Liquid 按两个字段对列表进行排序 例如 先按年份排序 然后按标题排序 我努力了 assign list site data papers papers sort year sort title 但这使得它
  • 使用 Visual Studio 测试适配器增强单元测试 - 设置工作目录

    我正在尝试使用 boost 单元测试 并使用 Visual Studio 测试适配器集成到 VS 2013 中 我的单元测试测试了一个库 该库需要另一个 DLL 存在于其工作目录中 它是通过在链接器设置下的 附加输入 中指定 lib 来链接
  • Android KitKat chrome://inspect/devices 网络监控,如何查看所有请求数据

    我正在使用 chrome inspect devices 并监控 Android 应用程序的 http 流量 这仅适用于 Android 4 4 KitKat 在这个工具中 set cookie 和 cookie 数据不会显示 是否有其他工
  • 获取AppServiceProvider中的路由参数

    我在应用程序的每条路线中都设置了公司参数 我正在尝试将该公司的变量发送到每个视图以便于访问 在我的 AppServiceProvider php 中 我尝试了两件事 company App make request gt route gt
  • 字符串与十六进制值的用户定义文字

    关于这个问题 https stackoverflow com questions 63197844 vector from long hex value 63213120 63213120 为什么a用户定义的文字 https en cppr
  • ASP MVC 3:如何对选择列表进行客户端验证?

    在阅读了这里的一些问题 答案后 我设法弄清楚如何将选择列表添加到表单并用数据填充它 如下所示 Html DropDownList S new SelectList ViewBag S Id Nme Sel a S 而且效果很好 不过我想补充
  • 在 Linux 上 - 将最大打开文件数设置为无限制。可能的?

    是否可以将打开文件的最大数量设置为某个 无限 值 或者必须是一个数字 我需要将守护程序用户的描述符限制设置为 无限制 我正在尝试确定这是否可能或如何做到 我看到一些邮件列表引用了可以使用的 最大值 例如 myuser Hard nofile
  • 如何读取JSON数据?

    这是json数据格式吗 string json answer Line 1 mark 1 answer Line 3 mark 1 我尝试下面的代码 但它只适用于一个参数 前任 answer Line 1 mark 1 我尝试拆分 json
  • VS Code devcontainer - Dockerfile 中的 containerUser 和 USER 有什么区别?

    来自doc https code visualstudio com docs remote devcontainerjson reference containerUser 覆盖在容器内运行的所有操作的用户 容器 默认为 root 或最后一
  • 使用 SAX 解析器解析大型 XML 文件(跳过一些行/标签)

    我目前正在开发一个使用 SAX 从互联网检索数据的应用程序 我之前用它来解析简单的 XML 文件 例如 Google Weather API 然而 我感兴趣的网站将解析提升到了一个新的水平 页面很大 看起来很乱 我只需要检索一些特定的行 其
  • 使用 cluster.fork() 调试 Node.js 进程

    我有一些代码看起来非常类似于集群文档中的示例 http nodejs org docs v0 6 0 api cluster html http nodejs org docs v0 6 0 api cluster html 以机智 var
  • 检测 macOS 上的用户活动

    我使用函数 IOPMSchedulePowerEvent 来安排睡眠或唤醒事件 并使用 IORegisterForSystemPower 注册我的守护程序以接收电源状态更改 一切正常 当系统进入睡眠状态并稍后在预定时间醒来时 我的守护进程会
  • 如何添加新的 xib 文件

    我必须开发一个具有多个屏幕的应用程序 我已经自动生成了 xib 文件 但对于我的另一个屏幕 我需要另一个 xib 文件 如何创建另一个 xib 文件 假设 XCode 4 在 文件 gt 新建文件 菜单对话框中 有一个名为 用户界面 的小节
  • JSF 组件中立即=true VS 立即=false

    我正在阅读 Core JavaServer Faces 并且正在研究事件处理 它表示 如果某个组件 比如说按钮 的immediate true 那么当我们单击该按钮时 JSF 生命周期的流程验证和调用应用程序面将提前完成 这是什么意思 任何
  • bash:睡眠进程没有被杀死[重复]

    这个问题在这里已经有答案了 我写了一个简单的 bash 脚本 它除了休眠之外什么也不做 bin bash echo Sleeping sleep 180s 运行脚本后 我看到系统上正在运行两个进程 user 22880 0 0 0 0 12
  • 是否可以通过在页面上获取三个点来校正页面尺寸?

    我正在研究纠正页面 图像 的宽度 高度和角度的逻辑 点r1 r2 r3在正确图像上 点d1 d2 d3是当前图像上的对应点 我尝试了多种方法并最终解决了这个问题 public System Drawing Bitmap CorrectFil
  • Angular.js 内存泄漏,我什么时候应该开始担心

    所以我有一个相当大的应用程序构建在角度上 有很多嵌套状态 很多指令 数据表和东西 我们最近决定切换到完整的单页 而不是只有几个小的单一应用程序部分 比如文章 人员 仪表板以前都是一个小的单页应用程序 所以我开始更多地处理性能 在 Chrom