NEWS
FATAL ERROR: Reached heap limit Allocation failed JavaS....
-
Hallo
Ich habe einen Raspberry 4B+ 4GB mit einer SDD 120GB neu aufgesetzt und IoBroker installiert.
Soweit funktioniert alles wie es soll ausser dass gelegentlich, ca. einmal pro Tag, IoBroker (Node Red) abstürzt und aber sofort automatisch wieder startet. Meistens geschieht das am Morgen wenn die Benutzeroberfläche (Projektiert in Node Red) geöffnet wird. Solange am System, insbesondere in Node Red projektiert wird gab es auch über längere Zeit kein Absturtz.
Auf dem Raspberry läuft nur der IoBroker und das integrierte Node Red. Node Red dient für verschiedene Kommunikationen und für die Visualisierung und Bedienung.Folgendes zeigt iob diag:
Ausschnitt aus der Log-Datei von iobroker:
<--- Last few GCs ---> [2335:0x3fa20cd0] 58199875 ms: Scavenge (reduce) 125.2 (129.9) -> 125.1 (130.9) MB, 3.72 / 0.00 ms (average mu = 0.997, current mu = 0.353) allocation failure; [2335:0x3fa20cd0] 58200056 ms: Mark-Compact (reduce) 126.1 (130.9) -> 125.7 (131.9) MB, 132.68 / 0.01 ms (average mu = 0.993, current mu = 0.484) allocation failure; scavenge might not succeed <--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory ----- Native stack trace ----- 1: 0xb8859c node::OOMErrorHandler(char const*, v8::OOMDetails const&) [node-red] 2025-08-05 08:02:24.711 - [33mwarn[39m: node-red.0 (2145) 2: 0xecd59c v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node-red] 3: 0xecd76c v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node-red] 4: 0x10d53fc [node-red] 5: 0x10eb8d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node-red] 6: 0x10c463c v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node-red] 7: 0x10c5400 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node-red] 8: 0x10a4420 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [node-red] 9: 0x1095c98 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [node-red] 10: 0x109845c v8::internal::FactoryBase<v8::internal::Factory>::NewRawOneByteString(int, v8::internal::AllocationType) [node-red] 11: 0x150aef0 v8::internal::IncrementalStringBuilder::Extend() [node-red] 12: 0x11f79e8 v8::internal::JsonStringifier::SerializeDouble(double) [node-red] 13: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 14: 0x11fd8d0 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 15: 0x11fb38c v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 16: 0x11fb6f8 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 17: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 18: 0x11fb38c v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 19: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 20: 0x11fd8d0 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 21: 0x11fe8e0 v8::internal::JsonStringify(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [node-red] 22: 0xf603c0 v8::internal::Builtin_JsonStringify(int, unsigned long*, v8::internal::Isolate*) [node-red] 23: 0x18b7964 [node-red] 2025-08-05 08:02:24.749 - [32minfo[39m: node-red.0 (2145) Node-RED exited with nullWenn ich das richtig intepretiere gibt es einen Speicherüberlauf durch die Ausführung eines JavaScript innerhlab von Node Red.
Wie finde ich die Ursache des Problems (Vorgehen)?
Vielen Dank
Heinz -
Hallo
Ich habe einen Raspberry 4B+ 4GB mit einer SDD 120GB neu aufgesetzt und IoBroker installiert.
Soweit funktioniert alles wie es soll ausser dass gelegentlich, ca. einmal pro Tag, IoBroker (Node Red) abstürzt und aber sofort automatisch wieder startet. Meistens geschieht das am Morgen wenn die Benutzeroberfläche (Projektiert in Node Red) geöffnet wird. Solange am System, insbesondere in Node Red projektiert wird gab es auch über längere Zeit kein Absturtz.
Auf dem Raspberry läuft nur der IoBroker und das integrierte Node Red. Node Red dient für verschiedene Kommunikationen und für die Visualisierung und Bedienung.Folgendes zeigt iob diag:
Ausschnitt aus der Log-Datei von iobroker:
<--- Last few GCs ---> [2335:0x3fa20cd0] 58199875 ms: Scavenge (reduce) 125.2 (129.9) -> 125.1 (130.9) MB, 3.72 / 0.00 ms (average mu = 0.997, current mu = 0.353) allocation failure; [2335:0x3fa20cd0] 58200056 ms: Mark-Compact (reduce) 126.1 (130.9) -> 125.7 (131.9) MB, 132.68 / 0.01 ms (average mu = 0.993, current mu = 0.484) allocation failure; scavenge might not succeed <--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory ----- Native stack trace ----- 1: 0xb8859c node::OOMErrorHandler(char const*, v8::OOMDetails const&) [node-red] 2025-08-05 08:02:24.711 - [33mwarn[39m: node-red.0 (2145) 2: 0xecd59c v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node-red] 3: 0xecd76c v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node-red] 4: 0x10d53fc [node-red] 5: 0x10eb8d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node-red] 6: 0x10c463c v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node-red] 7: 0x10c5400 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node-red] 8: 0x10a4420 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [node-red] 9: 0x1095c98 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [node-red] 10: 0x109845c v8::internal::FactoryBase<v8::internal::Factory>::NewRawOneByteString(int, v8::internal::AllocationType) [node-red] 11: 0x150aef0 v8::internal::IncrementalStringBuilder::Extend() [node-red] 12: 0x11f79e8 v8::internal::JsonStringifier::SerializeDouble(double) [node-red] 13: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 14: 0x11fd8d0 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 15: 0x11fb38c v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 16: 0x11fb6f8 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 17: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 18: 0x11fb38c v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 19: 0x11fdca4 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 20: 0x11fd8d0 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [node-red] 21: 0x11fe8e0 v8::internal::JsonStringify(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [node-red] 22: 0xf603c0 v8::internal::Builtin_JsonStringify(int, unsigned long*, v8::internal::Isolate*) [node-red] 23: 0x18b7964 [node-red] 2025-08-05 08:02:24.749 - [32minfo[39m: node-red.0 (2145) Node-RED exited with nullWenn ich das richtig intepretiere gibt es einen Speicherüberlauf durch die Ausführung eines JavaScript innerhlab von Node Red.
Wie finde ich die Ursache des Problems (Vorgehen)?
Vielen Dank
Heinz@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Wie finde ich die Ursache des Problems (Vorgehen)?
In den Node-RED Instanzeinstellungen kannst du die Speicherzuweisung erhöhen, die steht im Standard auf 128MB. Das ist für größere Flows etwas knapp, also einfach mal auf z.B. 256 MB erhöhen, das sollte reichen. RAM hast du genug.
EDIT:
Über den Endpunkt "/diagnostics" in Node-RED kannst du übrigens den Speicherverbrauch überwachen. Entscheidend ist der Wert "heapUsed". Der sollte sich nach einer Weile auf einen Wert einpendeln und nicht weiter steigen. -
@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Wie finde ich die Ursache des Problems (Vorgehen)?
In den Node-RED Instanzeinstellungen kannst du die Speicherzuweisung erhöhen, die steht im Standard auf 128MB. Das ist für größere Flows etwas knapp, also einfach mal auf z.B. 256 MB erhöhen, das sollte reichen. RAM hast du genug.
EDIT:
Über den Endpunkt "/diagnostics" in Node-RED kannst du übrigens den Speicherverbrauch überwachen. Entscheidend ist der Wert "heapUsed". Der sollte sich nach einer Weile auf einen Wert einpendeln und nicht weiter steigen.@marc-berg sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
RAM hast du genug.
@bugs
Und das könnte man noch optimieren, indem man keinen Desktop verwendet.*** DISPLAY-SERVER SETUP *** Display-Server: true Desktop: LXDE-pi Terminal: x11 System is booting into 'graphical.target'. Usually a server is running in 'multi-user.target'. Please set BootTarget to 'multi-user.target' or run 'iobroker fix' -
@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Wie finde ich die Ursache des Problems (Vorgehen)?
In den Node-RED Instanzeinstellungen kannst du die Speicherzuweisung erhöhen, die steht im Standard auf 128MB. Das ist für größere Flows etwas knapp, also einfach mal auf z.B. 256 MB erhöhen, das sollte reichen. RAM hast du genug.
EDIT:
Über den Endpunkt "/diagnostics" in Node-RED kannst du übrigens den Speicherverbrauch überwachen. Entscheidend ist der Wert "heapUsed". Der sollte sich nach einer Weile auf einen Wert einpendeln und nicht weiter steigen.@marc-berg
Vielen Dank für die rasche Antwort und treffende, fachkundige Rückmeldung.Der Raspberry läuft nun seit 24h ohne Absturz, ich bin sehr zuversichtlich dass die projektierte Speichergzuweisung zu knapp war. Neu ist sie auf 256 MB eingestellt, wie von dir vorgeschlagen. Der aktuelle "heapUsed" Wert liegt aktuell im Bereich 130MB bis 145MB, sollte der Wert steigen werde ich die Speicherzuweisung weiter erhöhen.
@Codierknecht
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop. -
@marc-berg
Vielen Dank für die rasche Antwort und treffende, fachkundige Rückmeldung.Der Raspberry läuft nun seit 24h ohne Absturz, ich bin sehr zuversichtlich dass die projektierte Speichergzuweisung zu knapp war. Neu ist sie auf 256 MB eingestellt, wie von dir vorgeschlagen. Der aktuelle "heapUsed" Wert liegt aktuell im Bereich 130MB bis 145MB, sollte der Wert steigen werde ich die Speicherzuweisung weiter erhöhen.
@Codierknecht
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop.@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop.
Wozu? Macht das Ganze nur unnötig komplex. Updates sind aufwändiger, Sicherheitslücken wahrscheinlicher (mehr Code da unnötigerweise mitläuft), Ressourcen werden verballert usw.
Ein Desktop ist auf einem Server überflüssig wie ein Kropf.
-
@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop.
Wozu? Macht das Ganze nur unnötig komplex. Updates sind aufwändiger, Sicherheitslücken wahrscheinlicher (mehr Code da unnötigerweise mitläuft), Ressourcen werden verballert usw.
Ein Desktop ist auf einem Server überflüssig wie ein Kropf.
@thomas-braun sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop.
Wozu? Macht das Ganze nur unnötig komplex. Updates sind aufwändiger, Sicherheitslücken wahrscheinlicher (mehr Code da unnötigerweise mitläuft), Ressourcen werden verballert usw.
Ein Desktop ist auf einem Server überflüssig wie ein Kropf.
Da ich nicht häufig mit Linux arbeite sind mir die Befehle und der Syntax im Terminal nicht geläufig.
Für mich ist dann die Bedienung über den Desktop z.B. Dateimanager, Geany oder das Kopieren der Speicherkarte mit 'SD Card Copier' usw. einfacher, übersichtlicher und schneller. -
@thomas-braun sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Dass der Desktop suboptimal ist ist mir bewusst, solange jedoch alles ohne Probleme läuft behalte ich die Version mit Desktop.
Wozu? Macht das Ganze nur unnötig komplex. Updates sind aufwändiger, Sicherheitslücken wahrscheinlicher (mehr Code da unnötigerweise mitläuft), Ressourcen werden verballert usw.
Ein Desktop ist auf einem Server überflüssig wie ein Kropf.
Da ich nicht häufig mit Linux arbeite sind mir die Befehle und der Syntax im Terminal nicht geläufig.
Für mich ist dann die Bedienung über den Desktop z.B. Dateimanager, Geany oder das Kopieren der Speicherkarte mit 'SD Card Copier' usw. einfacher, übersichtlicher und schneller.@bugs sagte in FATAL ERROR: Reached heap limit Allocation failed JavaS....:
Da ich nicht häufig mit Linux arbeite sind mir die Befehle und der Syntax im Terminal nicht geläufig.
Da ich hauptsächlich unter Windows unterwegs bin, sind mir seltener verwendete Befehle auch nicht geläufig.
Die schreibe ich mir dann in meine eigene "Knowledgebase" oder schlage sie nach.Dafür spare ich mir aber das herumschleppen eines Desktop, der nur unnötig Ressourcen frisst.
Was nicht installiert ist muss auch nicht aktualisiert werden, kann keine Fehler produzieren oder Lücken ins System reißen.
Insbesondere auf einem nicht so üppig ausgestatteten System.Und da man ja auch nicht alle Nase lang an einem gut funktionierenden System rumschrauben muss, vermisse ich auch keine grafische Oberfläche.