如果无法分配内存,V8会崩溃吗?这会导致整个过程崩溃吗?

时间:2016-08-02 02:55:48

标签: javascript c++ exception stl v8

此问题与one I recently asked about LLVM类似。

V8在手动管理的堆上分配JavaScript对象,其内存最终从mmap / VirtualAlloc(在Linux / Windows上)获得。但是,对于其内部数据结构,V8 uses C++ standard containers such as std::vector。如果这些容器需要分配内存但无法分配内存,则通常会抛出std::bad_alloc

然而,V8 is compiled with -fno-exceptions。如果无法使用异常,V8如何处理内部数据结构无法分配内存的情况?它崩溃了吗?如果是这样,这会占用嵌入V8的任何进程吗?

1 个答案:

答案 0 :(得分:5)

一般情况下,即使你的代码是用-fno-exceptions编译的(那么new也不会抛出std::bad_alloc但它会返回nullptr)标准的C ++库libstdc ++是使用例外编译时,new仍会在内存不足时抛出std::bad_alloc

那就是说,严肃地说,当你内存不足以尽可能快地崩溃时(通常是)你可以做的最好的事情。如果您需要某种可靠性,那么使用 monitor 进程将更容易重启您的应用程序。

V8做什么?显然,他们重载了new运算符,当分配失败时(malloc()仍然返回NULL,当然)他们调用特殊函数来处理低内存条件。它转储一些调试信息,报告此错误(您可能有一个自定义错误处理程序),然后(如果错误处理程序返回)调用FATAL()退出应用程序。

浏览api.cc on GitHub的源代码。从代码中,只需:

  

当V8无法分配内存时,会调用FatalProcessOutOfMemory。   调用默认的OOM错误处理程序并停止执行。