Hallo zusammen,
nachdem ich mehrere Stunden mich mit der Fehler Meldung "JavaScript heap out of memory" rumgeschlagen haben, möchte ich euch über einen Lösungansatz/Workaround zu diesem Fehler berichten.
Der Hintergrund
Es kann wie in meinem Fall vorkommen, dass ein Adapter dem vom System bzw. Nodejs vorgegeben Arbeitseicherspeicher überschreitet und mit dem Fehler "JavaScript heap out of memory" abbricht.
Bei mir war das der Javascript Adapter, weil dieser immer ab einer Arbeitsspeicherauslasstung von 1200MB neugestartet ist (unabhängig vom ausgeführten Skript). Mit der Version 12 besitzt Nodejs die Memory Managemant Funktion (Garbage Collection Explained) die abhägig von der aktuellen Speichersystemauslastung dem auszuführenden Node Process/Adapter Speicher freigibt und diesen limitiert. Jetzt kann es in größeren Umgebung vorkommen, das dieser Wert schnell erreicht ist.
Mit den führen Nodejs Versionen war es möglich das Speicherlimit über die System Variable (export NODE_OPTIONS=--max-old-space-size=2000) oder über den Zusatz des Parameters (--max-old-space-size=2048) zu erhöhen.
Mit der Version Nodejs 12 ist das nur begrenzt möglich.
Der Iobroker WebAdmin bietet zwar die Möglichkeit eine Arbeitspeicherlimit über den Experten Modus einzustellen (Instanzen ->Expertenmodus-> Ramlimit). Normalerweise steht dort kein Wert, was zu folge hat, dass Nodejs (GCE) die Speicherlimiterung übernimmt. Setzt man jedoch dort einen wert, so wird zwar der Parameter (--max-old-space-size=2048) bei ausführen des Adapter/Processes hinzugefüght, jedoch greif diese Anpassung nicht.
Lösung/Workaround:
man setzt den Parameter (--max-old-space-size=2048) im gesamten Iobroker hoch. Hier zu edtiert man die Systemctl Startconfig
nano /lib/systemd/system/iobroker.service
ersetzt den Eintrag
Environment="NODE=$(which node)"
durch
Environment="NODE=/usr/bin/node --max-old-space-size=2048"
Systemctl Änderungen neu einlesen
systemctl daemon-reload
und IOBROKER neustarten
iobroker restart
Die Änderungen hat zur Folge, das der Parameter "--max-old-space-size=2048" nun auf jeden Adapter/ Process innerhalb des Iobrokers greift. Meine Vermutung ist, dass der Parameter nur dann greift, wen dieser vor und nicht nach der js Datei angegeben wird. z.B.
node /path/adapter.js --max-old-space-size=2048 <<< bewirkt nichts (über den iobroker WebAdmin)
node --max-old-space-size=2048 /path/adapter.js <<< funktioniert (über die systemctl Startconfig)
Ich hoffe es hilf den einen oder anderen weiter und evtl. den Entwicklern der WebGUI.