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的任何进程吗?
一般情况下,即使您的代码是使用编译的-fno-exceptions(然后new不会抛出std::bad_alloc但它会返回nullptr),标准C++库libstdc ++会被编译为异常,然后当您运行内存不足时new仍会抛出std::bad_alloc.
也就是说,严肃地说,当你内存不足以尽可能快地崩溃时(通常是)你可以做的最好的事情.如果您需要某种可靠性,那么使用重启应用程序的监视器进程会更容易.
V8做什么?显然他们重载了new运算符,当分配失败时(当然malloc()还是返回NULL),他们调用一个特殊的函数来处理低内存条件.它转储一些调试信息,报告此错误(您可能有一个自定义错误处理程序)然后(如果错误处理程序返回)调用FATAL()退出应用程序.
在GitHub上的api.cc上浏览源代码.从代码中,简单地说:
当V8无法分配内存时,会调用FatalProcessOutOfMemory.调用默认的OOM错误处理程序并停止执行.
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |