hi

V8 JavaScript引擎:Chrome浏览器的一小步,V8引擎的一大步

hi · 2017-04-04翻译 · 325阅读 原文链接

V8 JavaScript引擎:Chrome浏览器的一小步,V8引擎的一大步

V8在其heap大小上有其硬性限制。这可作为对内存泄漏应用的保障。当应用程序达到此硬性限制,V8做了一系列不得已的垃圾回收。如果垃圾收集不利于释放V8内存并停止执行,并报告内存外的一个失败,如果没有硬限制内存泄漏,应用程序可以使用所有系统内存并伤害的其他应用程序的性能。

讽刺的是,这个保障机制,使内存泄漏调查JavaScript开发更难。应用程序会在开发管理内存时,在DevTools检查heap之前耗尽内存。此外,因为它使用一个普通的V8实例DevTools过程本身可能会耗尽内存。例如,看一下这个关于heap的演示,此演示将由于内存溢出,在当前所有稳定的Chrome浏览器中中止执行。

历史上,V8的heap限制可以被方便地设置,以适应在32位整数范围内具有一定的余量。随着时间的推移这种便利导致V8马虎的混合了代码类型的不同位宽,有效打破并增加了突破heap极限的能力。最近,我们清理了垃圾收集器的代码,从而能够使用更大的heap大小。DevTools已经利用此功能,并考虑在前面提到的那个演示堆快照的demo按预期工作在最新版本的Chrome Canary上。

我们还在DevTools增加了一个功能,在它接近耗尽内存时暂停应用程序。此功能是应用程序研究在短时间内分配大量内存导致错误bug时非常有用。当在最新版本的Chrome Canary运行这个演示时,DevTools在应用程序内存溢出故障之前暂停,并增加了heap堆限制,给用户一个机会来检查heap堆,评估在控制台上的输出,并加以释放内存,然后继续执行进一步调试。

V8嵌入器可以通过增加heap堆限制set_max_old_space_size的ResourceConstraints API的功能来做。但是要注意,在垃圾收集某些阶段关注对heap堆大小的线性相关性。垃圾收集暂停可能导致较大的heap堆增加。

译者hi尚未开通打赏功能

相关文章