Diese Frage ähnelt einem, das ich kürzlich über LLVM gefragt habe .
V8 weist JavaScript-Objekte auf einem manuell verwalteten Heap zu, dessen Speicher letztlich von mmap / VirtualAlloc (unter Linux / Windows) bezogen wird. Für seine internen Datenstrukturen verwendet V8 C ++ - Standardcontainer wie z std::vector
. Wenn diese Container Arbeitsspeicher reservieren müssen, aber nicht können, wird in der Regel std::bad_alloc
ausgelöst.
Allerdings wird V8 mit -fno-exceptions kompiliert. Wenn Ausnahmen nicht verwendet werden können, wie behandelt V8 die Situation, in der die internen Datenstrukturen keinen Speicher zuordnen können? Stürzt es ab? Wenn ja, macht dies einen Prozess, der V8 bettet?
Im Allgemeinen, selbst wenn Ihr Code mit -fno-exceptions
kompiliert wird (dann wird new
nicht std::bad_alloc
sondern stattdessen nullptr
zurückgeben) wird die Standard C ++ Bibliothek libstdc ++ mit Ausnahmen kompiliert, dann new
wird werfen Sie immer noch std::bad_alloc
, wenn Sie nicht genügend Arbeitsspeicher haben.
Das heißt, ernsthaft, wenn Sie nicht mehr genügend Speicher haben, um so schnell wie möglich zu stürzen, ist (meistens) das Beste, was Sie tun können. Wenn Sie irgendeine Art von Zuverlässigkeit benötigen, ist es viel einfacher, einen Monitor -Prozess zu haben, der Ihre Anwendung neu startet.
Was macht V8? Offensichtlich haben sie new
operator überladen, und wenn die Zuweisung fehlschlägt ( malloc()
gibt natürlich immer noch NULL
zurück), rufen sie eine spezielle Funktion auf, um wenig Speicherbedingungen zu verarbeiten. Es werden einige Debug-Informationen ausgegeben, dieser Fehler gemeldet (Sie verfügen möglicherweise über einen benutzerdefinierten Fehlerhandler) und dann (falls der Fehlerhandler zurückgegeben wird) rufen Sie FATAL()
auf, um die Anwendung zu beenden.
Durchsuchen Sie den Quellcode unter api.cc auf GitHub . Aus dem Code einfach:
Wenn V8 Speicher nicht zugewiesen werden kann, wird FatalProcessOutOfMemory aufgerufen. Der standardmäßige OOM-Fehlerhandler wird aufgerufen und die Ausführung wird gestoppt.
Tags und Links javascript c++ stl exception v8