我有许多函数调用链中的下一个函数,将相当大的数据集处理成同样大的不同数据集:
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);之后没有代码。也许如果我可以释放内存,我的标签可能会在处理这种大小的数据集时存活下来。我能这么做吗?
发布于 2016-01-10 13:47:50
如果没有看到更多关于内存使用的实际操作,我们很难判断您是否使用了太多内存,或者是否只需要释放较早的内存。
而且,Javascript中的内存并不是由堆栈框架“拥有”的,所以这个问题的前提似乎做了一个错误的假设。Javascript中的内存是垃圾回收的,当没有活动的、可访问的代码仍然具有对数据的引用时,它有资格进行垃圾回收,并将在垃圾收集器下一次运行时(在JS空闲时间内)进行垃圾回收。
也就是说,如果您的代码像您的问题所示进行了一系列嵌套函数调用,那么您可以通过执行以下一些操作来减少内存使用量:
null)。null>d11>来运行链中的下一步,从而使垃圾回收器有机会在您处理或存储的早期临时代码上执行其操作从根本上使用较少内存的数据。https://stackoverflow.com/questions/34702358
复制相似问题