如果无法分配内存,V8 会崩溃吗?这会使整个过程崩溃吗?
Does V8 crash if it cannot allocate memory? Does this crash the entire process?
这个问题类似于。
V8 在手动管理的堆上分配 JavaScript 个对象,其内存最终从 mmap/VirtualAlloc(在 Linux/Windows 上)获得。然而,对于它的内部数据结构,V8uses C++ standard containers such as std::vector
。如果这些容器需要分配内存但无法分配,它们通常会抛出 std::bad_alloc
.
然而,V8is compiled with -fno-exceptions。如果不能使用异常,V8如何处理内部数据结构无法分配内存的情况?它会崩溃吗?如果是这样,这会取消任何嵌入 V8 的进程吗?
通常即使你的代码是用 -fno-exceptions
编译的(那么 new
不会抛出 std::bad_alloc
但它会 return nullptr
代替)标准 C++ 库 libstdc++ 编译时有异常,然后当你 运行 内存不足时 new
仍然会抛出 std::bad_alloc
。
也就是说,严肃地说,当您 运行 内存不足时尽快崩溃(通常情况下)是您能做的最好的事情。如果您需要某种可靠性,那么使用 monitor 进程来重启您的应用程序会容易得多。
V8 有什么作用?显然他们重载了 new
运算符,当分配失败时(malloc()
仍然是 returns NULL
,当然)他们调用了一个 special 函数处理内存不足的情况。它转储一些调试信息,报告此错误(您可能有自定义错误处理程序)然后(如果错误处理程序 returns)调用 FATAL()
退出应用程序。
在 api.cc on GitHub 浏览源代码。从代码中,简单地:
When V8 cannot allocated memory FatalProcessOutOfMemory is called.
The default OOM error handler is called and execution is stopped.
这个问题类似于
V8 在手动管理的堆上分配 JavaScript 个对象,其内存最终从 mmap/VirtualAlloc(在 Linux/Windows 上)获得。然而,对于它的内部数据结构,V8uses C++ standard containers such as std::vector
。如果这些容器需要分配内存但无法分配,它们通常会抛出 std::bad_alloc
.
然而,V8is compiled with -fno-exceptions。如果不能使用异常,V8如何处理内部数据结构无法分配内存的情况?它会崩溃吗?如果是这样,这会取消任何嵌入 V8 的进程吗?
通常即使你的代码是用 -fno-exceptions
编译的(那么 new
不会抛出 std::bad_alloc
但它会 return nullptr
代替)标准 C++ 库 libstdc++ 编译时有异常,然后当你 运行 内存不足时 new
仍然会抛出 std::bad_alloc
。
也就是说,严肃地说,当您 运行 内存不足时尽快崩溃(通常情况下)是您能做的最好的事情。如果您需要某种可靠性,那么使用 monitor 进程来重启您的应用程序会容易得多。
V8 有什么作用?显然他们重载了 new
运算符,当分配失败时(malloc()
仍然是 returns NULL
,当然)他们调用了一个 special 函数处理内存不足的情况。它转储一些调试信息,报告此错误(您可能有自定义错误处理程序)然后(如果错误处理程序 returns)调用 FATAL()
退出应用程序。
在 api.cc on GitHub 浏览源代码。从代码中,简单地:
When V8 cannot allocated memory FatalProcessOutOfMemory is called. The default OOM error handler is called and execution is stopped.