Node.js kehabisan memori

247

Hari ini saya menjalankan skrip saya untuk pengindeksan sistem file untuk menyegarkan indeks file RAID dan setelah 4 jam macet dengan kesalahan berikut:

[md5:]  241613/241627 97.5%  
[md5:]  241614/241627 97.5%  
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

Server dilengkapi dengan RAM 16GB dan swap SSD 24GB. Saya sangat meragukan skrip saya melebihi memori 36gb. Setidaknya itu tidak seharusnya

Script membuat indeks file yang disimpan sebagai Array Objek dengan file metadata (tanggal modifikasi, izin, dll, tanpa data besar)

Berikut kode skrip lengkap: http://pastebin.com/mjaD76c3

Saya sudah pernah mengalami masalah simpul aneh di masa lalu dengan skrip ini yang memaksa saya misalnya. indeks terbagi menjadi beberapa file sebagai node sedang glitching ketika bekerja pada file besar seperti String. Apakah ada cara untuk meningkatkan manajemen memori nodejs dengan dataset besar?

Lapsio
sumber

Jawaban:

315

Jika saya ingat dengan benar, ada batas standar ketat untuk penggunaan memori di V8 sekitar 1,7 GB, jika Anda tidak menambahnya secara manual.

Dalam salah satu produk kami, kami mengikuti solusi ini dalam skrip penerapan kami:

 node --max-old-space-size=4096 yourFile.js

Akan ada juga perintah ruang baru tetapi seperti yang saya baca di sini: a-tour-of-v8-garbage-collection ruang baru hanya mengumpulkan data jangka pendek yang baru dibuat dan ruang lama berisi semua struktur data yang dirujuk yang harus dalam kasing Anda pilihan terbaik.

Felix
sumber
Dengan cara yang sama konfigurasi ini untuk nodejs secara independen pada framework. @ Simer
Felix
Saya mengembangkan dengan sudut 4 dan mendapatkan masalah yang sama, apa yang seharusnya menjadi file YourFile.js untuk aplikasi sudut?
Vikram
@ VikramSingh Anda menggunakan ng serveatau apakah Anda mendistribusikan hasil dari ng buildfolder / dist oleh server web lain seperti express? Tetapi jika proyek Angular Anda menggunakan lebih dari 1.7GB Memory standar daripada Anda mungkin akan memiliki masalah arsitektur dalam aplikasi Anda? Sepertinya Anda menggunakan pengembangan env dengan mulai nmp mungkin ini adalah solusi untuk itu github.com/mgechev/angular-seed/issues/2063
Felix
Saya menggunakan ng membangun dengan cli dan aot sudut (folder dist)
Vikram
2
indeks, file js @ Techdive yang Anda gunakan untuk memulai server
Basit
77

Untuk berjaga-jaga kalau ada yang mengalami ini dalam lingkungan di mana mereka tidak dapat mengatur properti simpul secara langsung (dalam kasus saya alat build):

NODE_OPTIONS="--max-old-space-size=4096" node ...

Anda dapat mengatur opsi simpul menggunakan variabel lingkungan jika Anda tidak bisa meneruskannya di baris perintah.

Kamiel Wanrooij
sumber
Bisakah Anda jelaskan apa yang Anda maksud, ketika Anda mengatakan "... setel opsi simpul menggunakan variabel lingkungan .."?
Keselme
6
@Keselme Variabel lingkungan adalah variabel yang telah ditetapkan di server tempat semua proses dapat membaca data. Buka terminal SSH ke server Anda dan ketik: MY_VAR = halo lalu ketik: echo $ MY_VAR. Anda akan melihat bahwa ia mencetak "halo" di terminal. Anda baru saja mengatur variabel lingkungan dan membacanya kembali.
Rob Evans
bekerja di Ubuntu 18.04, baru saja menambahkan perintah ekspor ke file bashrc saya
Rahal Kanishka
76

Jika Anda ingin meningkatkan penggunaan memori node secara global - tidak hanya satu skrip, Anda dapat mengekspor variabel lingkungan, seperti ini:
export NODE_OPTIONS=--max_old_space_size=4096

Maka Anda tidak perlu bermain dengan file saat menjalankan build like npm run build.

Maksim Luzik
sumber
1
Sebagai kenyamanan tambahan, tambahkan ke profil bash_profile atau zsh.
Tropicalrambler
24

Saya mengalami masalah ini ketika mencoba debug dengan VSCode, jadi hanya ingin menambahkan ini adalah bagaimana Anda dapat menambahkan argumen ke pengaturan debug Anda.

Anda dapat menambahkannya ke runtimeArgsproperti konfigurasi Anda launch.json.

Lihat contoh di bawah ini.

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}
Astr-o
sumber
21

Berikut adalah beberapa nilai flag untuk menambahkan beberapa info tambahan tentang cara memungkinkan lebih banyak memori ketika Anda memulai server node Anda.

1GB - 8GB

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js 

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb 
node --max-old-space-size=8192 index.js 
Nicholas Porter
sumber
dapatkah seseorang terus meningkatkannya dalam kekuatan 2? haruskah seseorang mengaturnya lebih besar dari memori sistem? jika tidak, apa itu memori sistem yang baik untuk rasio ukuran ruang-lama-max?
Harry Moreno
3
@ HarryMoreno Anda benar-benar dapat memasukkan nilai angka apa pun yang Anda suka. Tidak harus berkekuatan 2. Tapi tidak yakin tentang rasio. Ini hanya batas maksimal, tidak akan menggunakan semua memori. Saya hanya akan mengaturnya setinggi yang Anda butuhkan kemudian skala kembali jika diperlukan.
Nicholas Porter
Saya akan mencoba ram sistem - 1GB. Dengan asumsi vm ini hanya untuk menjalankan aplikasi node ini.
Harry Moreno
2
@ HarryMoreno Rasio memori sistem yang baik untuk ukuran ruang-max-tua sepenuhnya tergantung pada apa lagi yang berjalan pada mesin Anda. Anda dapat meningkatkannya dalam kekuatan dua - atau Anda dapat menggunakan nomor apa pun. Anda dapat mengaturnya lebih besar dari memori sistem - tetapi Anda akan mendapatkan masalah swap.
Gigimoi
20

saya berjuang dengan ini bahkan setelah pengaturan --max-old-space-size.

Kemudian saya menyadari perlu meletakkan opsi --max-old-space-size sebelum script karma.

terbaik juga untuk menentukan sintaksis --max-old-space-size dan --max_old_space_size skrip saya untuk karma:

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

referensi https://github.com/angular/angular-cli/issues/1652

duchuy
sumber
5
" terbaik untuk menentukan kedua sintaks --max-old-space-size dan --max_old_space_size " - Anda tidak perlu melakukan ini, mereka adalah sinonim. Dari nodejs.org/api/cli.html#cli_options : "Semua opsi, termasuk opsi V8, memungkinkan kata-kata dipisahkan oleh tanda hubung (-) atau garis bawah (_)."
ZachB
6
max-executable-size telah dihapus dan berakhir dengan kesalahan ketika digunakan: github.com/nodejs/node/issues/13341
crashbus
Saya harus memotongnya --max-old-space-size=8192 --optimize-for-size --max_old_space_size=8192 --optimize_for_sizedan berhasil
Sergey Pleshakov
16

Saya memiliki masalah serupa saat melakukan AOT angular build. Mengikuti perintah membantu saya.

npm install -g increase-memory-limit
increase-memory-limit

Sumber: https://geeklearning.io/angular-aot-webpack-memory-trick/

Chandru
sumber
1
Cheers bekerja untuk saya, mungkin perlusudo npm -g install increase-memory-limit --unsafe-perm
Leo
11

Namun, menemukan dan memperbaiki memori babi dengan sesuatu seperti memwatch mungkin membantu.

NathanQ
sumber
10

Langkah-langkah untuk memperbaiki masalah ini (Di Windows) -

  1. Buka command prompt dan ketik %appdata%tekan enter
  2. Arahkan ke %appdata%> folder npm
  3. Buka atau Edit ng.cmddi editor favorit Anda
  4. Tambahkan --max_old_space_size=8192ke blok IF dan ELSE

node.cmdFile Anda terlihat seperti ini setelah perubahan:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
Umang Patwa
sumber
Ini khusus Windows. OP tidak menyebutkan apapun tentang Windows.
Dan Dascalescu
@DanDascalescu Jawaban yang Diperbarui. Terima kasih telah memberi tahu
Umang Patwa
6

Variabel lingkungan berikut dapat digunakan:

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

Catatan lain: console.log()juga menghabiskan memori di terminal.

baru saja mencoba mengomentari console.log () di terminal. karena itu juga akan memakan memori.

Amar Powar
sumber
6
Apakah ini jawaban atau komentar untuk beberapa jawaban? Ada banyak jawaban denganNODE_OPTIONS= --max-old-space-size=somesize
barbsan
5

jika Anda ingin mengubah memori secara global untuk node (windows), pergi ke pengaturan sistem lanjutan -> variabel lingkungan -> variabel pengguna baru

variable name = NODE_OPTIONS
variable value = --max-old-space-size=4096
Ahmed Aboud
sumber
4

Saya telah mencoba šŸ‘ kode di bawah ini dan berfungsi dengan baikāœŒ.

  • buka terminal dari direktori root proyek
  • jalankan cmd untuk mengatur ukuran baru.

    set NODE_OPTIONS=--max_old_space_size=8172

Atau Anda dapat memeriksa tautan untuk info lebih lanjut https://github.com/nodejs/node/issues/10137#issuecomment-487255987

rkumar1904
sumber
4

Saya hanya ingin menambahkan bahwa di beberapa sistem, bahkan dengan meningkatkan batas memori node --max-old-space-size, itu tidak cukup dan ada kesalahan OS seperti ini:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

Dalam hal ini, mungkin karena Anda mencapai maks mmap per proses.

Anda dapat memeriksa max_map_count dengan menjalankan

sysctl vm.max_map_count

dan meningkatkannya dengan menjalankan

sysctl -w vm.max_map_count=655300

dan memperbaikinya untuk tidak diatur ulang setelah reboot dengan menambahkan baris ini

vm.max_map_count=655300

dalam /etc/sysctl.conffile.

Periksa di sini untuk info lebih lanjut.

Metode yang baik untuk menganalisis kesalahan adalah dengan menjalankan prosesnya strace

strace node --max-old-space-size=128000 my_memory_consuming_process.js
jbaylina
sumber
3

Saya menghadapi masalah yang sama baru-baru ini dan menemukan utas ini tetapi masalah saya adalah dengan ReactApp. Di bawah ini perubahan dalam perintah simpul mulai menyelesaikan masalah saya.

Sintaksis

node --max-old-space-size=<size> path-to/fileName.js

Contoh

node --max-old-space-size=16000 scripts/build.js

Mengapa ukurannya 16000 dalam ukuran max-old-space-size?

Pada dasarnya, ini bervariasi tergantung pada memori yang dialokasikan untuk utas itu dan pengaturan simpul Anda.

Bagaimana cara memverifikasi dan memberikan ukuran yang tepat?

Ini pada dasarnya tinggal di mesin kami v8. kode di bawah ini membantu Anda untuk memahami Ukuran Tumpukan mesin simpul lokal v8 Anda.

const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
Venkat.R
sumber
2

Saya baru saja menghadapi masalah yang sama dengan instance EC2 saya t2.micro yang memiliki memori 1 GB.

Saya menyelesaikan masalah dengan membuat file swap menggunakan url ini dan mengatur variabel lingkungan berikut.

export NODE_OPTIONS=--max_old_space_size=4096

Akhirnya masalahnya telah hilang.

Saya harap itu akan membantu masa depan.

Bat-Orshikh Baavgaikhuu
sumber
1

Untuk berjaga-jaga jika ini dapat membantu orang yang mengalami masalah ini saat menggunakan aplikasi nodejs yang menghasilkan penebangan yang berat, seorang kolega menyelesaikan masalah ini dengan menyalurkan output standar ke file.

Adrien Joly
sumber
1

Jika Anda mencoba meluncurkan bukan nodesendiri, tetapi beberapa lunak lainnya, misalnya webpackAnda dapat menggunakan variabel dan cross-envpaket lingkungan :

$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
  webpack --progress --config build/webpack.config.dev.js
Piterden
sumber
1

Untuk bundling proyek sudut, saya telah menambahkan baris di bawah ini ke file pakage.json saya di bagian skrip .

"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /"

Sekarang, untuk menggabungkan kode saya, saya menggunakan npm run build-prodbukanng build --requiredFlagsHere

semoga ini membantu!

rgantla
sumber
0

Tingkatkan simpul ke versi terbaru. Saya berada di node 6.6 dengan kesalahan ini dan ditingkatkan ke 8.9.4 dan masalahnya hilang.

Richard Frank
sumber
0

Dalam kasus saya, saya telah menjalankan npm installversi node sebelumnya, setelah beberapa hari saya meningkatkan versi node dan ram npm installuntuk beberapa modul. Setelah ini saya mendapatkan kesalahan ini. Untuk memperbaiki masalah ini, saya menghapus folder node_module dari setiap proyek dan berlari npm installlagi.

Semoga ini bisa memperbaiki masalah.

Catatan: Ini terjadi pada mesin lokal saya dan diperbaiki pada mesin lokal saja.

Gampesh
sumber
0

Perintah ini bekerja dengan sempurna. Saya memiliki ram 8GB di laptop saya, Jadi saya mengatur ukuran = 8192. Ini semua tentang ram dan juga Anda perlu mengatur nama file. Saya menjalankan npm run build command itu sebabnya saya menggunakan build.js .

node --expose-gc --max-old-space-size=8192 node_modules/react-scripts/scripts/build.js
Taha Farooqui
sumber
0

Dalam kasus saya, saya memutakhirkan versi node.js ke yang terbaru dan itu berfungsi seperti pesona.

Angela Rana
sumber
Halo Angela dan selamat datang di SO! Bisakah Anda menentukan versi persis Node.js yang Anda perbarui untuk pembaca yang akan datang? Terima kasih!
kant312
Saya memutakhirkan ke Versi LTS Terbaru: 12.18.0
Angela Rana