【问题标题】:Does a recursive setTimeout cause a stack info memory leak? [duplicate]递归 setTimeout 是否会导致堆栈信息内存泄漏? [复制]
【发布时间】:2019-11-18 22:46:00
【问题描述】:

我有以下场景:

let func = () => {
  //...
  let id = setTimeout(() => {
    console.trace();
    clearTimeout(id);
    func();
  }, 2000);
}

func();

虽然我读到清除超时句柄将释放闭包和处理程序本身的内存,但我仍然很好奇堆栈信息是否可能泄漏。我故意调用了console.trace(),看起来堆栈信息无限增长。这不是一个问题吗?我知道它不在类似递归的堆栈上,我们可能会遇到堆栈大小异常,但我仍然担心堆栈信息会不断增长。

【问题讨论】:

  • 故意调用console.trace(),看起来堆栈信息无限增长”什么意思?每个滴答声您只需获得一个控制台条目。大多数浏览器控制台甚至会在该行中添加一个计数器,而不是填充它。由于函数完成,它所占用的堆栈帧会自动清除,并且......就是这样。泄漏点在哪里?
  • 可能是开发人员。唯一的事情?在 Chrome 开发者工具中,有一个“禁用异步堆栈跟踪”选项

标签: javascript recursion memory-leaks settimeout


【解决方案1】:

没有。当func 完成执行时,堆栈展开。

如果 func 是递归的,堆栈将如下所示:

   [init] -> func -> func -> func -> func -> func -> .... 

在你的情况下是这样的:

  [init] -> func -> setTimeout
       <----     <----

  [timer] -> func -> setTimeout
      <----      <----

  [timer] -> func -> setTimeout
      <----      <----

  ...

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 2014-11-01
    • 2013-04-04
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多