首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Javascript中释放前一堆栈帧的内存

如何在Javascript中释放前一堆栈帧的内存
EN

Stack Overflow用户
提问于 2016-01-10 13:21:53
回答 1查看 133关注 0票数 0

我有许多函数调用链中的下一个函数,将相当大的数据集处理成同样大的不同数据集:

代码语言:javascript
复制
function first_step(input_data, second_step_callback)
{
  result = ... // do some processing
  second_step_callback(result, third_step);
}

function second_step(intermediate_data, third_step_callback)
{
  result = ... // do some processing
  third_step_callback(result);
}

function third_step(intermediate_data) { }

first_step(huge_data, second_step);

third_step中,我的内存快用完了(当内存使用量达到1.5 GB时,Chrome似乎会关闭标签页)。

我认为,当到达third_step()时,仍然保留来自first_step()input_data,因为first_step()在调用堆栈上,不是吗?至少在调试器运行时,我可以看到数据。

显然我不再需要它了。在first_step()中,在second_step_callback(result, third_step);之后没有代码。也许如果我可以释放内存,我的标签可能会在处理这种大小的数据集时存活下来。我能这么做吗?

EN

回答 1

Stack Overflow用户

发布于 2016-01-10 13:47:50

如果没有看到更多关于内存使用的实际操作,我们很难判断您是否使用了太多内存,或者是否只需要释放较早的内存。

而且,Javascript中的内存并不是由堆栈框架“拥有”的,所以这个问题的前提似乎做了一个错误的假设。Javascript中的内存是垃圾回收的,当没有活动的、可访问的代码仍然具有对数据的引用时,它有资格进行垃圾回收,并将在垃圾收集器下一次运行时(在JS空闲时间内)进行垃圾回收。

也就是说,如果您的代码像您的问题所示进行了一系列嵌套函数调用,那么您可以通过执行以下一些操作来减少内存使用量:

  1. 清除不再需要的保存大型数据的变量(只需将它们设置为null)。
  2. 减少了保存大型数据的中间变量的使用。
  3. 减少了数据的复制。
  4. 减少了带有中间结果的字符串操作,因为每个操作都会创建内存块,然后必须使用<null>d11>来运行链中的下一步,从而使垃圾回收器有机会在您处理或存储的早期临时代码上执行其操作从根本上使用较少内存的数据。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34702358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档