Πώς να διορθώσετε το “Σφάλμα JavaScript Heap Out of Memory”

Η JavaScript παραμένει μια από τις πιο χρησιμοποιούμενες γλώσσες προγραμματισμού λόγω της ευελιξίας της. Για την εκτέλεση της JavaScript εκτός περιβάλλοντος προγράμματος περιήγησης, οι προγραμματιστές πρέπει να εγκαταστήσουν το Node.js, ένα περιβάλλον χρόνου εκτέλεσης μεταξύ πλατφορμών.

Το σφάλμα JavaScript heap out of memory είναι συνηθισμένο κατά την εκτέλεση ενός έργου JavaScript Node.js.

Το πρόβλημα εξόδου μνήμης JavaScript είναι ένα σφάλμα που παρουσιάζεται όταν η προεπιλεγμένη μνήμη που εκχωρείται από το σύστημα του υπολογιστή είναι ανεπαρκής για την εκτέλεση ενός μεγάλου έργου.

Εάν αντιμετωπίσετε το σφάλμα heap out of memory, το πρόγραμμά σας θα διακοπεί και θα εμφανίσει αυτήν την έξοδο.

ΘΑΝΑΤΙΚΟ ΣΦΑΛΜΑ: CALL_AND_RETRY_LAST Η κατανομή απέτυχε – η μνήμη JavaScript εξαντλήθηκε

Ή

Θανατηφόρο σφάλμα: η μη έγκυρη κατανομή μεγέθους πίνακα απέτυχε – η μνήμη του javascript εξαντλήθηκε

Αιτίες σφάλματος εξόδου μνήμης JavaScript

  • Παρουσία μεγάλων δομών δεδομένων: Η εργασία με μεγάλες δομές δεδομένων, όπως πίνακες ή πίνακες, μπορεί να καταναλώσει πολύ χώρο, προκαλώντας τελικά σφάλμα εξόδου της μνήμης.

Αυτό είναι ένα παράδειγμα μιας μεγάλης δομής δεδομένων με ένα δισεκατομμύριο στοιχεία.

let array = [];

for (let i = 0; i < 1000000000; i++) {

  array.push(i);

}
  • Κακή διαχείριση μνήμης: Καθώς η εφαρμογή σας μεγαλώνει, πρέπει να αφήσετε μερικά από τα αντικείμενα που δεν χρειάζεστε πλέον.

Αυτό είναι ένα παράδειγμα λειτουργίας που οδηγεί σε διαρροή μνήμης.

let array = [];

setInterval(function() {

  array.push(new Array(1000000).join("x"));

}, 1000);
  • Άπειροι βρόχοι: Ένας τέτοιος κώδικας εκτελείται για πάντα καθώς δεν επιτυγχάνεται ποτέ μια καταληκτική συνθήκη.

Αυτό είναι ένα παράδειγμα άπειρου βρόχου που θα εκτελείται για πάντα.

while (true) {

    console.log(1);

}

Οι άπειροι βρόχοι μπορούν να οδηγήσουν σε αυτό το σφάλμα, καθώς χρησιμοποιεί τη μνήμη αρκετά γρήγορα.

  • Αναδρομικές συναρτήσεις: Μια αναδρομική συνάρτηση είναι μια συνάρτηση που καλεί τον εαυτό της έμμεσα ή άμεσα για να επαναλάβει ένα/ορισμένο σύνολο εντολών/ών έως ότου πληρούνται/εκπληρώνονται μια συγκεκριμένη συνθήκη. Εάν αυτές οι λειτουργίες είναι καλά σχεδιασμένες, πιθανότατα θα οδηγήσουν σε οδηγό μνήμης και, τελικά, σε ένα σωρό σφάλματα μνήμης.
  • Παρουσία πολλών αντικειμένων σε ένα κομμάτι κώδικα: Εάν ο κώδικάς σας έχει πολλά μεγάλα αντικείμενα, η μνήμη που χρησιμοποιείται από αυτά τα αντικείμενα συλλογικά μπορεί να οδηγήσει σε υπερφόρτωση.
  Πώς να συνεργαστείτε σε μια παρουσίαση του Microsoft PowerPoint

Διορθώστε το σφάλμα JS heap out of memory

Αυτό το σφάλμα μπορεί να παρουσιαστεί σε λειτουργικά συστήματα που βασίζονται σε Windows, macOS και Linux όπως το Ubuntu. Ευτυχώς, το σφάλμα μπορεί να διορθωθεί, ανεξάρτητα από το λειτουργικό σας σύστημα.

#1. Διόρθωση του σφάλματος σωρού JavaScript εκτός μνήμης στο λειτουργικό σύστημα Windows

Βήμα 1: Κάντε κλικ στο μενού έναρξης και εντοπίστε τις Ρυθμίσεις συστήματος για προχωρημένους.

Βήμα 2: Κάντε κλικ στις Μεταβλητές Περιβάλλοντος στο κάτω αριστερό μέρος του πλαισίου διαλόγου.

Βήμα 3: Κάντε κλικ στο Νέο είτε στις μεταβλητές χρήστη είτε στις μεταβλητές συστήματος. Η πρώτη επιλογή εφαρμόζει τις αλλαγές στον τρέχοντα λογαριασμό χρήστη. Ωστόσο, η δεύτερη επιλογή εφαρμόζει τις αλλαγές σε ολόκληρο το σύστημα.

Βήμα 4: Θα εμφανιστούν δύο επιλογές. στο όνομα της μεταβλητής, πληκτρολογήστε NODE_OPTIONS και στην τιμή μεταβλητής, πληκτρολογήστε –max-old-space-size=4096. Σε αυτό το βήμα, η εικόνα 4096 θα εκχωρήσει 4 GB εικονικής μνήμης στο Node.js. Μπορείτε να εκχωρήσετε περισσότερα, όπως 8 GB, ορίζοντας την τιμή ως –max-old-space-size=8192.

Βήμα 5: Κάντε κλικ στο ok, εφαρμόστε και τέλος, ok για να αποθηκεύσετε τις αλλαγές.

Μπορείτε επίσης να χρησιμοποιήσετε το τερματικό Windows PowerShell για να επιλύσετε το σφάλμα. Ανοίξτε το τερματικό στο λειτουργικό σύστημα Windows και πληκτρολογήστε την ακόλουθη εντολή.

env:NODE_OPTIONS="--max-old-space-size=4096"

Μπορείτε επίσης να λύσετε το σφάλμα προσωρινά εκτελώντας αυτήν την εντολή πριν εκτελέσετε την εφαρμογή σας.

set NODE_OPTIONS=--max-old-space-size=4096

#2. Διόρθωση σφάλματος σωρού μνήμης JavaScript στο Linux

  • Βήμα 1: Προσδιορίστε την πηγή του σφάλματος. Ελέγξτε τα αρχεία καταγραφής ή την έξοδο της κονσόλας για να προσδιορίσετε τις γραμμές κώδικα/αρχείου που προκαλούν το σφάλμα.
  • Βήμα 2: Εξάγετε μια μεταβλητή περιβάλλοντος που καθορίζει την εικονική μνήμη που έχετε εκχωρήσει στο Node.js. Χρησιμοποιήστε αυτήν την εντολή.
export NODE_OPTIONS=--max-old-space-size=4096

Αυτά τα βήματα θα εκχωρήσουν 4 GB εικονικής μνήμης στο Node.js. Εάν το σφάλμα εξακολουθεί να υφίσταται, μπορείτε να αυξήσετε το μέγεθος της μνήμης διπλασιάζοντας.

Για παράδειγμα, εάν θέλετε να εκχωρήσετε 8 GB ως εικονική μνήμη, μπορείτε να εκτελέσετε αυτήν την εντολή.

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

#3. Διόρθωση σφάλματος σωρού μνήμης JavaScript στο macOS

Μπορείτε να λύσετε το σφάλμα JavaScript heap out of memory στο macOS χρησιμοποιώντας μια παρόμοια προσέγγιση όπως στο Linux. Ακολουθήστε αυτά τα βήματα;

  • Βήμα 1: Προσδιορίστε την πηγή του σφάλματος ελέγχοντας τα αρχεία καταγραφής ή την έξοδο της κονσόλας για να προσδιορίσετε τις γραμμές κώδικα/αρχείου που προκαλούν το σφάλμα.
  • Βήμα 2: Εξάγετε μια μεταβλητή περιβάλλοντος που καθορίζει την εικονική μνήμη που έχετε εκχωρήσει στο Node.js. Χρησιμοποιήστε αυτήν την εντολή.
export NODE_OPTIONS=--max-old-space-size=4096

Αυτά τα βήματα θα εκχωρήσουν 4 GB εικονικής μνήμης στο Node.js. Εάν το σφάλμα εξακολουθεί να υφίσταται, μπορείτε να αυξήσετε το μέγεθος της μνήμης διπλασιάζοντας.

  7 εργαλεία για τη δημιουργία μολύβδου μαγνητών που μετατρέπουν

Για παράδειγμα, εάν θέλετε να εκχωρήσετε 8 GB ως εικονική μνήμη, μπορείτε να εκτελέσετε αυτήν την εντολή.

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

Αύξηση μνήμης κατά την εγκατάσταση NPM

Οι λύσεις που προσφέραμε μέχρι στιγμής ταιριάζουν σε σφάλματα που παρουσιάζονται όταν εκτελείτε μια εφαρμογή Node.js. Ωστόσο, μπορείτε να εκχωρήσετε εικονική μνήμη για να επιλύσετε το σφάλμα εξόδου από τη μνήμη καθώς εγκαθιστάτε πακέτα JavaScript. Χρησιμοποιήστε αυτήν την εντολή.

node --max-old-space-size=4096 (which npm) install

Σημείωση: Μπορείτε να συνεχίσετε να αυξάνετε την κατανομή εικονικής μνήμης κατά 1 GB, 2 GB, 3 GB ή 4 GB. Πρέπει να καθορίσετε το μέγεθος της μνήμης σε MB. Ωστόσο, μην εκχωρήσετε ολόκληρη τη μνήμη του μηχανήματος στο Node.js, καθώς αυτό μπορεί να προκαλέσει διακοπή λειτουργίας του προγράμματός σας. Ως καλή πρακτική, εάν το μηχάνημά σας έχει 16 GB, μπορείτε να εκχωρήσετε έως και 8 GB στο Node.js.

Αποτρέψτε το σφάλμα σωρού μνήμης JavaScript

Έχουμε συζητήσει μέχρι στιγμής πώς να διορθώσετε το σφάλμα εκτός μνήμης σωρού JavaScript όταν παρουσιαστεί. Ευτυχώς, μπορείτε επίσης να έχετε μέτρα για να αποτρέψετε την εμφάνιση αυτού του σφάλματος καθώς εκτελείτε κώδικα JavaScript. Αυτές είναι μερικές από τις καλύτερες προσεγγίσεις:

#1. Χωρίστε τα δεδομένα σε μικρά κομμάτια

Μπορεί να έχετε ένα πρόγραμμα Node.js που εισάγει μεγάλα σύνολα δεδομένων από μεγάλα αρχεία CSV μέσω της διαδικασίας ETL: Extract – Transform – Load. Μπορεί να διαπιστώσετε ότι η εφαρμογή σας διακόπτεται πάντα όταν προσπαθείτε να εισαγάγετε τα δεδομένα. Εάν εργάζεστε με MongoDB, μπορείτε να λύσετε το σφάλμα έχοντας μια εντολή γραμμής εντολών όπως:

split -l 1000000 users.csv

Αυτή η εντολή δίνει εντολή στο Node.js να χωρίσει ένα αρχείο με όνομα χρήστες σε πολλά αρχεία με 1000000 χρήστες το καθένα. Η σημαία -l καθορίζει ότι το αρχείο πρέπει να χωριστεί με βάση τον αριθμό των γραμμών κώδικα.

#2. Παρακολούθηση χρήσης μνήμης

Μπορείτε να χρησιμοποιήσετε ένα προφίλ μνήμης για να ανιχνεύσετε διαρροές μνήμης στον κώδικά σας. Μπορείτε να συνδυάσετε την ενσωματωμένη μνήμη του Node.js και τα ChromeDevTools για να το πετύχετε. Τα δύο μπορούν να εντοπίσουν προβλήματα στον κώδικά σας και να τα διορθώσουν.

Μπορείτε επίσης να χρησιμοποιήσετε εξωτερικά εργαλεία όπως το Datadog, το New Relic και το AppDynamics για να παρακολουθείτε την απόδοση της εφαρμογής σας και να κάνετε τις απαραίτητες ενέργειες. Μπορείτε επίσης να ελέγξετε τη χρήση μνήμης στην εφαρμογή Node.js μέσω της μεθόδου process.memoryUsage().

  Πώς να επαναφέρετε την κάρτα γραφικών του υπολογιστή σας

#3. Αποφυγή διαρροών μνήμης

Διαρροές μνήμης συμβαίνουν όταν η εφαρμογή Node.js διατηρεί αναφορές σε αντικείμενα που δεν χρειάζεται πλέον. Εάν τέτοια αντικείμενα δεν συλλέγονται σκουπίδια, θα υπάρξει συσσώρευση χρήσης μνήμης με την πάροδο του χρόνου.

Υπάρχουν διάφορες προσεγγίσεις για την αποφυγή διαρροών μνήμης, όπως η αποφυγή καθολικών μεταβλητών στον κώδικά σας, η αποφυγή αποκλεισμού λειτουργιών εισόδου/εξόδου και η χρήση λέξεων-κλειδιών let και const όταν δηλώνετε τις μεταβλητές σας αντί για var.

#4. Διαδικασίες ωοτοκίας

Εάν εκτελείτε το Node.js σε ένα μηχάνημα με περιορισμένη μνήμη, όπως το Raspberry Pi, είναι πιθανό να αντιμετωπίσετε σφάλματα σωρού εκτός μνήμης. Μπορείτε να έχετε μία κύρια διαδικασία και άλλες να ομαδοποιούνται ως εργαζόμενοι. Μόλις η κύρια διεργασία εντοπίσει ότι το σύστημα εξαντλείται η μνήμη, θα σκοτώσει τη διαδικασία και θα αναθέσει την εργασία σε άλλη που δεν είναι υπερφορτωμένη.

#5. Ενημέρωση υλικού

Εάν η αύξηση της εκχώρησης μνήμης και η εκτέλεση των αναφερόμενων διαδικασιών για την αποτροπή του σφάλματος σωρού εκτός μνήμης δεν λύσουν τα προβλήματά σας, τότε μπορείτε να εξετάσετε το ενδεχόμενο ενημέρωσης του υλικού σας. Το Node.js μπορεί να τρέχει σε μνήμη RAM έως και 512 MB. Ωστόσο, η εφαρμογή σας θα απαιτεί περισσότερη μνήμη RAM καθώς μεγαλώνει.

Από την άλλη πλευρά, η αύξηση του αριθμού των CPU μπορεί επίσης να βελτιώσει την κατανομή μνήμης. Στην ιδανική περίπτωση, 2 ή περισσότερες CPU θα επιτρέψουν στην εφαρμογή σας να χρησιμοποιεί νήματα εργασίας για εργασίες με ένταση CPU, όπως κρυπτογραφία και επεξεργασία εικόνας.

Συχνές ερωτήσεις

Τι προκαλεί το σφάλμα JavaScript Heap Out of Memory;

Αυτό το σφάλμα μπορεί να προκληθεί από διάφορους λόγους.
1. Διαρροές μνήμης
2. Άπειροι βρόχοι
3. Παρουσία πολλών αντικειμένων σε ένα έργο
4. Παρουσία μεγάλων δομών δεδομένων

Είναι επιλύσιμο το σφάλμα JavaScript Heap Out of Memory;

Ναί. Μπορείτε να λύσετε το σφάλμα μέσω:
1. Εκχώρηση περισσότερης εικονικής μνήμης στο Node.js
2. Εξάλειψη διαρροών μνήμης
3. Βελτιστοποίηση του κωδικού σας
4. Αναβάθμιση του υλικού σας

Πώς μπορείτε να λύσετε το σφάλμα Heap Out of Memory στην εφαρμογή React;

Η React είναι μια από τις πιο δημοφιλείς βιβλιοθήκες JavaScript. Εντοπίστε το αρχείο package.json στον ριζικό κατάλογο και αυτές τις γραμμές στην ενότητα σεναρίων.

"scripts": {

    "start": "react-scripts --max_old_space_size=4096 start",

    "build": "react-scripts --max_old_space_size=4096 build",

    "test": "react-scripts test",

    "eject": "react-scripts eject"

}

Τυλίγοντας

Οι περισσότεροι προγραμματιστές έχουν συνηθίσει σε σφάλματα και σφάλματα κώδικα, όχι σε σφάλματα χρόνου εκτέλεσης, καθώς εκτελούν τα προγράμματά τους Node.js. Ευτυχώς, δεν χρειάζεται να ανησυχείτε, καθώς το σφάλμα εξάντλησης της μνήμης μπορεί να διορθωθεί. Ορίσαμε τι είναι το σφάλμα JavaScript heap out of memory, εξηγήσαμε πώς να το επιλύσετε και πώς να το αποφύγετε στο επόμενο έργο Node.js.

Στη συνέχεια, μπορείτε επίσης να διαβάσετε πώς να αποφύγετε ορισμένα κοινά σφάλματα JavaScript.