如果V8不能分配内存,会崩溃吗?这会导致整个进程崩溃吗?

8
这个问题与我最近关于LLVM的问题相似。
V8在手动管理的堆上分配JavaScript对象,其内存最终从mmap/VirtualAlloc(在Linux/Windows上)获得。但是,对于其内部数据结构,V8使用C++标准容器,如std::vector。如果这些容器需要分配内存,但无法分配,则通常会抛出std::bad_alloc异常。
然而,V8使用-fno-exceptions进行编译。如果不能使用异常,那么V8如何处理内部数据结构无法分配内存的情况?它会崩溃吗?如果是这样,是否会使嵌入V8的任何进程崩溃?

不,我的浏览器和我的node.js一样使用“V8”引擎。据我所见,崩溃问题与应用程序容器有关。 - Leroy Thompson
1
请查看此线程:https://groups.google.com/forum/#!topic/v8-users/n-dbQX1AvTM。顺便说一句,即使是 Google 的 C++ 风格指南也表示“我们不使用 C++ 异常” https://google.github.io/styleguide/cppguide.html#Exceptions。 - Vladislav Ivanishin
3
@VladislavIvanishin 之所以只因为“遗留代码”。 - jaggedSpire
1个回答

6
一般来说,即使您的代码使用-fno-exceptions编译(这样new就不会抛出std::bad_alloc,而是返回nullptr),标准C ++库libstdc ++仍然使用异常进行编译,因此当内存不足时,new仍将抛出std::bad_alloc
话虽如此,当您的内存不足时,尽快崩溃通常是您可以做的最好的事情(往往如此)。如果您需要某种可靠性,那么更容易拥有一个监视器进程来重新启动您的应用程序。
V8是怎么做的呢?显然,他们重载了new运算符,当分配失败时(当然,malloc()仍然返回NULL),他们调用一个特殊的函数来处理低内存条件。它会转储一些调试信息,报告此错误(您可能有一个自定义错误处理程序),然后(如果错误处理程序返回)调用FATAL()来退出应用程序。
在GitHub上浏览源代码api.cc。从代码中简单地获取:

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


1
显然他们重载了new运算符 - 你知道在代码中这个重载运算符是在哪里实现的吗? - user200783
内部类的基本分配器在allocator.h中。在那里,您还可以找到NewArray(),它在它们自己的Vector类中使用(相同的行为,如果malloc()返回null,则调用FatalProcessOutOfMemory())。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接