gpt4 book ai didi

javascript - 如何在 Javascript 中释放前一个堆栈帧的内存

转载 作者:行者123 更新时间:2023-12-03 07:58:24 24 4
gpt4 key购买 nike

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

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); 之后没有任何代码。也许如果我可以释放该内存,我的选项卡可能会在处理如此大小的数据集时幸存下来。我可以这样做吗?

最佳答案

如果没有看到您真正在做的更多事情正在使用内存,我们很难判断您是否只是使用了太多内存,或者您是否只需要释放较早的内存。

而且,Javascript 中的内存并不由堆栈帧“拥有”,因此问题的前提似乎做出了一些错误的假设。 Javascript 中的内存会被垃圾收集,并且当没有事件的、可访问的代码仍然引用数据时,就有资格进行 GC,并且会在垃圾收集器下次运行时(在 JS 空闲时间期间)进行垃圾收集。

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

  1. 清除不再需要的保存大量数据的变量(只需将它们设置为 null)。
  2. 减少保存大量数据的中间变量的使用。
  3. 减少数据复制。
  4. 减少对中间结果的字符串操作,因为每个字符串操作都会创建随后必须回收的内存块。
  5. 使用 setTimeout() 清除堆栈以运行链中的下一步,并让垃圾收集器有机会对较早的临时变量执行操作。
  6. 重新调整处理或存储数据的方式,从根本上使用更少的内存。

关于javascript - 如何在 Javascript 中释放前一个堆栈帧的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com