【问题标题】:Angular JS $log and memory leaksAngular JS $log 和内存泄漏
【发布时间】:2015-09-10 20:58:46
【问题描述】:

我正在阅读有关内存泄漏的信息,并且我了解使用 console.log() 将结构化对象(而不是字符串)写入控制台可能会导致内存泄漏。我的应用程序用户 Angular 的 $log.log() 做类似的事情。这会泄漏内存吗?

【问题讨论】:

    标签: javascript angularjs memory-leaks


    【解决方案1】:

    $log 服务在内部使用console.log - 来自source code:

      var console = $window.console || {},
          logFn = console[type] || console.log || noop,
          hasApply = false;
    

    但是,您可以在需要时使用$logProvider.debugEnabled(false); 禁用控制台消息,因此只要您记得在生产中关闭调试消息,就可以安全使用。

    【讨论】:

    • 感谢 Ori,这听起来可行。是否有像这样切换客户端设置的最佳实践/工作流程?例如,后端使用环境变量来确定开发/生产。您是否建议我将变量传递到 <script> 块中,还是有更好的方法来切换 debugEnabled?
    • 我也在构建一个大型网络应用程序。我认为即使console.log 也会产生内存泄漏,它会在浏览器的控制台面板中产生。它与当前的浏览选项卡无关。如果你打开 Chrome 的控制台,它会分叉另一个进程。
    • 我通常会做一个全局生产标志,因为我们必须关闭 $log、$compileProvider.debugInfoEnabled(false),并启用/禁用其他生产设置。您可以使用后端或构建工具将其注入 HTML 正文,或创建 settings.json 并将其数据与 browserify 或 webpack 集成。标志加载应该是同步的,并且发生在模块的配置阶段之前。
    • @stanleyxu2005 console.log 保存对原始对象的引用,因此您可以对其进行调试、更改等...这有时会导致内存泄漏,因为控制台中的引用是唯一的防止 GC 删除对象。
    【解决方案2】:

    正如 ori 所说,在生产环境中关闭日志消息应该可以解决这个问题。对于您仍然希望在生产中使用的消息,我建议您记录 JSON.stringify()。

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2016-04-03
      • 2021-09-10
      • 2014-09-20
      相关资源
      最近更新 更多