FATAL ERROR: Ineffektive Mark-Compacts nahe der Heap-Grenze Zuweisung fehlgeschlagen - JavaScript-Heap in Ionic 3 nicht genügend Speicher

157

Wenn ich ein ionic 3-Projekt mit dem Befehl "ionic serve" ausführe, wird der folgende Fehler angezeigt:

Geben Sie hier die Bildbeschreibung ein

Himanshu Shekhar
quelle

Antworten:

136

Für eine nicht eckige allgemeine Antwort für diejenigen, die auf dieser Frage von Google landen:

Jedes Mal, wenn Sie auf diesen Fehler stoßen, liegt dies wahrscheinlich an einem Speicherverlust oder einem Unterschied zwischen der Verwaltung des Speichers durch Knoten <= 10 und Knoten> 10. Normalerweise kann Ihr Programm nur durch Erhöhen des dem Knoten zugewiesenen Speichers ausgeführt werden, löst jedoch möglicherweise nicht das eigentliche Problem, und der vom Knotenprozess verwendete Speicher kann den von Ihnen zugewiesenen neuen Speicher immer noch überschreiten. Ich würde empfehlen, die Speichernutzung in Ihrem Knotenprozess zu profilieren, wenn er ausgeführt wird oder auf Knoten> 10 aktualisiert wird.

Ich hatte ein Speicherleck. Hier ist ein großartiger Artikel zum Debuggen von Speicherlecks im Knoten.

Um den Speicher in dem Terminal zu vergrößern, in dem Sie Ihren Knotenprozess ausführen:

export NODE_OPTIONS="--max-old-space-size=8192"

wo Werte von sein max-old-space-sizekönnen: [2048, 4096, 8192, 16384]etc.

[UPDATE] Weitere Beispiele für weitere Klarheit:

export NODE_OPTIONS="--max-old-space-size=5120" #increase to 5gb
export NODE_OPTIONS="--max-old-space-size=6144" #increase to 6gb
export NODE_OPTIONS="--max-old-space-size=7168" #increase to 7gb
export NODE_OPTIONS="--max-old-space-size=8192" #increase to 8gb

# and so on...

# formula:
export NODE_OPTIONS="--max-old-space-size=(X * 1024)" #increase to Xgb

# Note: it doesn't have to be multiples of 1024. 
# max-old-space-size can be any number of memory megabytes(MB) you have available.
Emmanuel NK
quelle
14
Danke, sollte beachtet werden 8192 bedeutet 8 GB.
jaggedsoft
11
Zu Ihrer Information, der Standardwert ist 512 MB. Sie müssen nicht direkt auf das 10-fache dieses Betrags springen, sondern können zuerst etwas zwischen 512 und 5120 ausprobieren.
Cameron Hudson
Vielen Dank, dass dies für alle Arten von Anwendungen mit Speicherproblemen funktioniert.
invinciblemuffi
4
Ich möchte nur darauf hinweisen - das ist nicht immer ein Hinweis auf einen Speicherverlust. Möglicherweise verwendet eine von Ihnen verwendete Bibliothek etwas mehr Speicher als früher. Für uns next.jsbegann unsere App mit der Schnellaktualisierungsfunktion zum Absturz zu bringen.
Daniel Cooke
62

Beheben Sie in meinem Fall dieses Problem bei der Installation von NodeJs, Version 12.10.0

Germán Ayala
quelle
1
Hier gilt das gleiche. Ich habe gerade die Version und ihre Werke geändert.
Brunocascio
9
Für den Kontext hat Knoten 12 eine andere Heap-Verwaltungsstrategie, die auf dem verfügbaren Speicher basiert, anstatt Standardeinstellungen zu verwenden. Weitere Details hier: Foundation.nodejs.org/announcements/2019/04/24/…
Derek Dowling
Nichts anderes hat bei mir funktioniert, das war es. Vielen Dank :)
Hussain Alaidarous
Wir haben auf Knoten 12 aktualisiert und der Fehler ist
verschwunden
1
@DerekDowling Wayback Ursache Link unterbrochen: web.archive.org/web/20191103115941/https://…
Grimmiger
61

das gleiche Problem auf Centos Server 7, aber dies löste mein Problem:

node --max-old-space-size=X node_modules/@angular/cli/bin/ng build --prod

Wo X = (2048 or 4096 or 8192 o..)ist der Wert des Gedächtnisses?

Hakim CHRIFI ALAOUI
quelle
2
nach dem Ändern des Wertes von x .. Fehler bleibt gleich
Sohail Ahmad
Wenn der Fehler weiterhin auftritt, erhöhen Sie die Größe so lange, bis genügend Speicher für die Verarbeitung vorhanden ist, um den Fehler schließlich zu verhindern. Das einzige Mal, dass ich diesen Fehler nicht überwinden konnte, war mit ng serveund eine massive .js-Datei, auf die im scriptsAbschnitt verwiesen wird, musste in den angular.jsonSpeicher geladen werden.
Atconway
Kann ich den Wert von X größer als 8192 einstellen? Ich habe 32 GB RAM
Diego
Für mich hat die Angabe der maximalen Größe des alten Speicherplatzes in der Befehlszeile NICHT funktioniert. Dies kann eine Interaktion mit NVV-basierten Knoten sein? Stattdessen habe ich in einem Bash-Skript 'NODE_OPTIONS = "- max-old-space-size = 2048" verwendet. Der Knoten $ NG build --prod --progress = false hat funktioniert, im Gegensatz zu' node --max-old -space-size = 2048 $ NG build --prod --progress = false ', was nicht der Fall war. Ich weiß immer noch nicht warum.
Simon H
25

Probieren Sie diese Lösung aus, auf die in einer alten Nachricht im Forum hingewiesen wurde: https://forum.ionicframework.com/t/3-7-0-ios-build-with-prod-not-working/107061/24

Öffnen node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js

Ändern Sie die erste Zeile von:

#!/usr/bin/env node

zu

#!/usr/bin/env node --max-old-space-size=4096

Probieren Sie die Werte 1024 und 2048 aus, aber für eine relativ große App benötigen Sie möglicherweise 4096.

Runnerpaul
quelle
20

Ich habe den gleichen Fehler erhalten, wenn ich einen ng buildBefehl in Visual Studio-Code ausführe . Ich kann jedoch erfolgreich erstellen, wenn ich dasselbe in der Windows-Befehlszeile in der folgenden Reihenfolge ausführe.

Schritt 1.

set NODE_OPTIONS=--max_old_space_size=4096

Schritt 2.

ng build
Sushrut Singh Sisodiya
quelle
10

Ich habe die gleiche Fehlermeldung erhalten, wenn ich die folgenden Anweisungen im Visual Studio-Code ausführe. Aber ich kann erfolgreich erstellen, wenn ich dasselbe in der Windows-Befehlszeile ausführe.

npm install -g increase-memory-limit
increase-memory-limit
set NODE_OPTIONS=--max_old_space_size=4096
ng build -c deploy --build-optimizer --aot --prod --sourceMap
heinels
quelle
7
node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --baseHref=/baseUrl/ --prod=true
Mohammad Lockman
quelle
20
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Eric Leschinski
7

Aus einigen Gründen hat die obige Antwort für mich nicht wirklich funktioniert. Ich habe Folgendes getan, um mein Problem zu beheben:

  1. Ich musste zuerst den node_modulesOrdner löschen
  2. Installieren Sie node.js erneut auf meinem PC und
  3. dann npm install
Sambayour
quelle
Schritt 2 ist nicht obligatorisch. Ich habe die obere Lösung ausprobiert und sie hat auch ohne Schritt 2 funktioniert
Analyst
5

node --max_old_space_size = 4096 ./node_modules/@angular/cli/bin/ng build --prod --build-optimizer

Durch Hinzufügen von Parametern wurde --build-optimizer das Problem in meinem Fall behoben.

Aktualisieren:

Ich bin nicht sicher, warum nur das Hinzufügen von --build-optimizer das Problem löst, aber gemäß eckigen Dokumenten sollte es mit aktiviertem aot verwendet werden, daher sollte der aktualisierte Befehl wie folgt aussehen

--build-optimizer=true --aot=true

Angular Build-Dokumente

Akshay Naik
quelle
4

Führen Sie diesen Befehl in Ihrem Projektordner aus. Verwenden Sie Serve anstelle von Build

node --max_old_space_size=8000 node_modules/@angular/cli/bin/ng serve  --prod --port=4202
Deepu Reghunath
quelle
4

Ersetzen Sie die Leitung

"start": "ng serve -o --port 4300 --configuration=en" mit

"start": "node --max_old_space_size=5096 node_modules/@angular/cli/bin/ng serve -o --port 4300 --configuration=en"

HINWEIS:

  1. Port - 4300 ist nicht konstant. Dies hängt davon ab, welchen Port Sie auswählen.

  2. --max_old_space_size = 5096 zu nicht konstant; ein beliebiger Wert 1024,2048,4096 usw.

Sarath Mohandas
quelle
4

In meinem Fall war es eine Rekursion , die dazu führte, dass die Reaktion den gesamten Speicher verbrauchte.

Dies geschah, als ich meinen Code überarbeitete und dies nicht bemerkte.

const SumComponent = () => {
  return (
    <>
      <SumComponent />
    </>
  ) 
}

In anderen Knoten-Apps könnte dies folgendermaßen aussehen:

const someFunction = () => {
  ...
  someFunction(); 
  ...
}
GoalsAndGambles
quelle
Warum war das ein Problem? <> </> sollte in React gültig sein, anstatt <React.Fragment> zu verwenden, oder?
Joelgullander
@Codehiker Ja, es ist eine neue Syntax in React 16
GoalsAndGambles
1
Die Rekursion SumComponententhält einen SumComponent(der einen SumComponententhält, der einen SumComponent... enthält )
Stein
3

Für mich war es ein Problem mit dem Firebase-Paket.

Fügen Sie nur "@ firebase / database" hinzu: "0.2.1", installieren Sie für Ihre package.json node_modules neu und funktionieren.

Pol Fernández
quelle
2

Ich habe das vorhandene Knotenmodul gelöscht und die folgenden Befehle ausgeführt, um mein Problem zu beheben

npm install -all
npm audit fix
Pritiranjan Swain
quelle
2

Eine weitere nicht eckige Antwort (ich hatte das gleiche Problem beim Erstellen einer Reaktions-App auf AWS Amplify).

Wie von Emmanuel erwähnt, scheint dies auf den Unterschied in der Art und Weise zurückzuführen zu sein, wie der Speicher von Knoten v10 gegenüber Knoten v12 behandelt wird.

Ich habe erfolglos versucht, das Gedächtnis zu vergrößern. Aber mit Knoten v12 hat es geschafft.

Überprüfen Sie, wie Sie nvm use $VERSION_NODE_12Ihre Build-Einstellungen wie unter @atlesp erläutert hier hinzufügen können: https://github.com/aws-amplify/amplify-console/issues/440#issuecomment-602626451 Bild

Kartonnade
quelle
1

Für mich bestand das Problem darin, einen zusätzlichen node_modulesOrdner zu haben, in den ich umbenannt habe, node_modules_oldund einen auszuführen npm install, um einen neuen zu generieren node_modules. Irgendwie muss der Build den node_modules_oldOrdner noch aufgenommen haben, also habe ich node_modules_olddas Verzeichnis verlassen, um das Problem zu beheben.

badjr
quelle
1

Bitte überprüfen Sie Ihre Knotenversion:

   $  node -v

Wenn es sich um 10.1.1 handelt, müssen Sie die Version Ihres Root-Knotens über die folgenden Befehle aktualisieren

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash


$ source ~/.nvm/nvm.sh

$ nvm ls

$ nvm install 12.18.1

Sobald dies erledigt ist, starten Sie bitte Ihr Terminal oder Visual Studio neu.

Es ist Arbeit 100 $

Für ionische Benutzer fügen Sie bitte den folgenden Code in Ihre package.json ein für ionische Benutzer

 "ionic:build": "node --max-old-space-size=16384 ./node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js build",
    

Yogesh Kumar
quelle
Eigentlich funktioniert das, wenn Sie Web app-scriptserstellen, aber wenn Sie Android oder Skript ionic cordova build androidwie bauen?
Muhammed Moussa
0

Überprüfen Sie Ihren Ordnernamen. Wenn Ihr Ordnername Leerzeichen enthält, werden diese Probleme generiert. Ohne Leerzeichen umbenennen. hoffe es wird funktionieren

Roney Francis
quelle
0

Wenn dies beim Ausführen der React-Anwendung auf VSCode passiert, überprüfen Sie bitte Ihre propTypes. Undefinierte Proptypes führen zu demselben Problem.

kishorekumaru
quelle
0

Bei mir ist dieser Fehler aufgetreten, weil ich den Zugriff auf den Ausgabepfad für den dist-Ordner in meiner Datei angle.json verloren habe. Nachdem ich mich mit aktualisierten Anmeldeinformationen wieder mit dem Remote-Pfad verbunden hatte, verschwand der Fehler.

justTech
quelle
0

#! / usr / bin / env-Knoten --max-old-space-size = 4096 in der Funktion ionic-app-scripts.js

Ändern

node_modules / .bin / ionic-app-scripts.cmd

Beim Hinzufügen:

@IF EXIST "% ~ dp0 \ node.exe" ("% ~ dp0 \ node.exe" "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *) ELSE ( @SETLOCAL @SET PATHEXT =% PATHEXT:;. JS; =;% node --max_old_space_size = 4096 "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *)

Arbeitete fianlly

Subhamay
quelle
0

Für mich stieß ich auf dieses Problem, als ich eslint und Prettier Fix ausführte und mit einem buildVerzeichnis in meinem React-Projekt formatierte , nachdem ich alles entfernt hatte. Ich denke, das liegt daran, dass es zu viele Dateien gibt.

Sean
quelle
0

Ich denke, es gibt viele Möglichkeiten, um diesen Fehler zu erreichen!

Auf meiner Seite hatte ich eine Schleife in meiner package.json. Projekt A hatte eine Abhängigkeit von Projekt B, das eine Abhängigkeit von Projekt A hatte.

Remi
quelle
0

Manchmal ist Einfachheit der Schlüssel zum Erfolg. Suchen Sie nach, while (i <= 10000) {}ohne iIhren Code zu erhöhen ;)

Matthis Kohli
quelle
0

Dieses Problem wurde behoben, nachdem ich alle Bibliotheken wie NodeJS, Typoskript, Garn, Npm usw. für mein Projekt aktualisiert habe.

Oguzhan KIRCALI
quelle
0

Geben Sie dies einfach in das Terminal ein:

export NODE_OPTIONS="--max-old-space-size=8192"
Matt
quelle
0

Das Aktualisieren von Knoten 12 auf Knoten 14 hat das Problem für mich gelöst

Hakan Fıstık
quelle