Pertanyaan Node.js tumpukan memori


Hari ini saya menjalankan skrip saya untuk pengindeksan sistem file untuk me-refresh indeks file RAID dan setelah 4 jam crash 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 16gb RAM dan 24GB SSD swap. Saya sangat meragukan naskah saya melebihi 36gb memori. Setidaknya seharusnya tidak

Script membuat indeks file yang disimpan sebagai Array of Objects dengan metadata file (tanggal modifikasi, perizinan, dll, tidak ada data besar)

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

Saya sudah mengalami masalah node aneh di masa lalu dengan skrip ini yang memaksa saya misalnya. split index menjadi beberapa file sebagai node glitch ketika bekerja pada file-file besar seperti String. Apakah ada cara untuk meningkatkan manajemen memori nodejs dengan dataset besar?


75
2017-07-25 02:45


asal


Jawaban:


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

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

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

Juga akan ada perintah ruang baru tetapi seperti yang saya baca di sini: a-tour-of-v8-sampah-koleksi ruang baru hanya mengumpulkan data jangka pendek yang baru dibuat dan ruang lama berisi semua struktur data yang direferensikan yang seharusnya dalam kasus Anda adalah opsi terbaik.


109
2017-07-25 05:29



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

Anda dapat menambahkannya ke runtimeArgs properti dari 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"
        ]
    }
]}

13
2018-06-20 01:26



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

Kemudian saya menyadari perlu menempatkan opsi --max-old-space-size sebelum skrip karma.

juga yang terbaik untuk menentukan kedua sintaks --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


4
2018-06-22 08:43



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


4
2018-06-30 16:00



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


3
2018-01-12 07:01



Hanya dalam kasus ini dapat membantu orang yang memiliki masalah ini saat menggunakan aplikasi nodejs yang menghasilkan penebangan besar, seorang rekan memecahkan masalah ini dengan memipitkan output standar ke file.


1
2018-04-04 08:39



Saya memiliki masalah yang sama saat melakukan AOT angular build. Perintah berikut membantu saya.

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

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


0
2017-07-31 11:52