2016-08-02 42 views
8

Diese Frage ist ähnlich wie one I recently asked about LLVM.Stürzt V8 ab, wenn Speicher nicht zugewiesen werden kann? Bringt dies den gesamten Prozess zum Absturz?

V8 weist JavaScript-Objekte auf einem manuell verwalteten Heap zu, dessen Speicher schließlich von mmap/VirtualAlloc (unter Linux/Windows) abgerufen wird. Jedoch für seine internen Datenstrukturen, V8 uses C++ standard containers such as std::vector. Wenn diese Container Speicher reservieren müssen, aber nicht können, werfen sie normalerweise std::bad_alloc.

Jedoch V8 is compiled with -fno-exceptions. 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, nimmt dies jeden Prozess, der V8 einbettet, herunter?

+0

Nein, mein Browser verwendet sowohl "V8" als auch meine node.js, soweit ich gesehen habe, gehen die Abstürze so weit, wie die Anwendungscontainer gehen. –

+1

Sehen Sie sich diesen Thread an: https://groups.google.com/forum/#!topic/v8-users/n-dbQX1AvTM. Übrigens, selbst der Google C++ - Stilführer sagt "Wir verwenden keine C++ - Ausnahmen" https://google.github.io/styleguide/cppguide.html#Exceptions –

+3

@VladislavIvanishin nur wegen [Legacy-Code] (http: // stackoverflow com/questions/5184115/google-c-style-guides-keine-ausnahmen-rule-stl) – jaggedSpire

Antwort

5

Im Allgemeinen, auch wenn Ihr Code mit -fno-exceptions kompiliert wird (dann new wird std::bad_alloc nicht werfen, aber es wird wieder nullptr statt) der Standard C++ Bibliothek libstdC++ mit Ausnahmen kompilieren dann new noch std::bad_alloc werfen, wenn Sie aus laufen von Speicher.

Das heißt, ernsthaft, wenn Sie nicht genügend Arbeitsspeicher haben, um so schnell wie möglich zum Absturz zu kommen, ist (mehr als oft nicht) 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 V8 tut? Offensichtlich überladen sie new Operator und wenn die Zuweisung fehlschlägt (gibt immer noch NULL, natürlich) rufen sie eine spezielle Funktion, um wenig Speicherbedingungen zu behandeln. Es gibt Debug-Informationen aus, meldet diesen Fehler (Sie verfügen möglicherweise über einen benutzerdefinierten Fehlerhandler) und rufen dann (falls Fehlerhandler zurückgegeben wird) FATAL() auf, um die Anwendung zu beenden.

Durchsuchen Quellcode um api.cc on GitHub. Von 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.

+1

_Obsichtlich sie 'new' operator_ überladen - wissen Sie, wo im Code dieser überladene Operator implementiert ist? – user200783

+0

Basiszuordner für _internal_ classes ist in allocator.h. Dort finden Sie auch NewArray() in ihrer eigenen Vector-Klasse verwendet (gleiches Verhalten, rufen Sie FatalProcessOutOfMemory() auf, wenn malloc() null zurückgibt). –