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

use*_*783 8 javascript c++ stl v8 exception

这个问题类似于我最近提出的关于LLVM的问题.

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

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

Adr*_*tti 5

一般情况下,即使您的代码是使用编译的-fno-exceptions(然后new不会抛出std::bad_alloc但它会返回nullptr),标准C++库libstdc ++会被编译为异常,然后当您运行内存不足时new仍会抛出std::bad_alloc.

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

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

在GitHub上的api.cc上浏览源代码.从代码中,简单地说:

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