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?

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.


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.


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.


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"
        ]
    }
]}

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 

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


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


11

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


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" %*
)

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.


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


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

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);

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.


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.


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

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!


0

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


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.


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

0

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.