此问题与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的任何进程吗?
答案 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错误处理程序并停止执行。