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 内存泄漏,我什么时候应该开始担心 的相关文章

  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • 如何使用 JQuery 动态排序

    如果我有一个下拉列表和一个列表框 有没有办法使用 JQuery 根据下拉列表对列表框进行排序 举个例子会很有帮助 这会改变下拉菜单中的顺序 您必须根据自己的标准设置顺序
  • 如何判断 jquery 对话框是否打开? [复制]

    这个问题在这里已经有答案了 寻找通用案例解决方案来确定当前是否打开任何 jquery 对话框 有多个 试过 ui dialog content dialog isOpen true ui dialog dialog isOpen true
  • jQuery 获取元素内的鼠标位置

    我希望制作一个控件 用户可以在 div 内单击 然后拖动鼠标 然后松开鼠标以指示他们想要的内容有多长 这是针对日历控件的 因此用户将指示特定事件的时间长度 看起来最好的方法是在父 div 上注册一个 mousedown 事件 而父 div
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • jQuery 对象相等

    如何确定两个 jQuery 对象是否相等 我希望能够在数组中搜索特定的 jQuery 对象 inArray jqobj my array 1 alert deviceTypeRoot deviceTypeRoot False alert d
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 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