schedule2021-04-17

【Node.js】yarn generateでヒープ領域が不足してエラーになったのでヒープ領域の設定を変更して処理を実行した

Nuxt.jsで静的サイトを作成する処理を実行したら、計算途中でメモリが不足してエラーとなり止まってしまった。 ヒープ領域を確保して処理を通します。

参考: https://qiita.com/nakamto/items/8ed18f9f0d980fd70be1

環境

  • CentOS Linux 7
  • node v14.15.3
  • yarn 1.22.10

エラー

$ yarn generate

(省略)


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0xa04200 node::Abort() [/usr/local/bin/node]
 2: 0x94e4e9 node::FatalError(char const*, char const*) [/usr/local/bin/node]
 3: 0xb7860e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 4: 0xb78987 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 5: 0xd33215  [/usr/local/bin/node]
 6: 0xd33d9f  [/usr/local/bin/node]
 7: 0xd41e2b v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/bin/node]
 8: 0xd459ec v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/usr/local/bin/node]
 9: 0xd0b2f2 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/usr/local/bin/node]
10: 0xd05174 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [/usr/local/bin/node]
11: 0xd074c1 v8::internal::FactoryBase<v8::internal::Factory>::NewRawTwoByteString(int, v8::internal::AllocationType) [/usr/local/bin/node]
12: 0x1097b49 v8::internal::Runtime_StringBuilderConcat(int, unsigned long*, v8::internal::Isolate*) [/usr/local/bin/node]
13: 0x1400039  [/usr/local/bin/node]
error Command failed with signal "SIGABRT".
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

解決方法

処理を実行する前にNODE_OPTIONSmax-old-space-sizeを設定します。

$ export NODE_OPTIONS="--max-old-space-size=2048"

数値の単位はメガバイトです。 2048MBは2GBです。

V8ヒープの使用量がヒープ制限に近づいたとき、V8ヒープスナップショットをディスクに書き込み領域を確保します。

NODE_OPTIONSについて: https://nodejs.org/api/cli.html#cli_max_old_space_size_size_in_megabytes