Stürzt V8 ab, wenn Speicher nicht zugewiesen werden kann? Bringt dies den gesamten Prozess zum Absturz?

8

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?

    
user200783 02.08.2016, 02:55
quelle

1 Antwort

5

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.

    
Adriano Repetti 04.08.2016, 06:57
quelle

Tags und Links