MeWrite Docs

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

Node.jsでメモリ不足が発生した場合のエラー

概要

JavaScript heap out of memory は、Node.jsプロセスが使用可能なヒープメモリを超えた場合に発生する致命的なエラーです。

エラーメッセージ

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

原因

1. 大きなデータの処理

1
2
3
4
5
// NG: 巨大な配列を一度に作成
const hugeArray = [];
for (let i = 0; i < 100000000; i++) {
  hugeArray.push({ data: 'some data' });
}

2. メモリリーク

1
2
3
4
5
// NG: グローバル変数に蓄積
const cache = [];
function processRequest(data) {
  cache.push(data);  // 解放されない
}

3. 大きなファイルの読み込み

1
2
3
// NG: 全体をメモリに読み込む
const fs = require('fs');
const content = fs.readFileSync('huge-file.csv', 'utf8');

解決策

1. ヒープサイズを増やす

1
2
3
4
5
# 4GBに増やす
node --max-old-space-size=4096 script.js

# 環境変数で設定
export NODE_OPTIONS="--max-old-space-size=4096"

2. ストリーム処理を使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const fs = require('fs');
const readline = require('readline');

// OK: 1行ずつ処理
const rl = readline.createInterface({
  input: fs.createReadStream('huge-file.csv'),
  crlfDelay: Infinity
});

rl.on('line', (line) => {
  processLine(line);
});

3. バッチ処理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
async function processBatch(items, batchSize = 1000) {
  for (let i = 0; i < items.length; i += batchSize) {
    const batch = items.slice(i, i + batchSize);
    await Promise.all(batch.map(processItem));

    // GCを促す(必要な場合)
    if (global.gc) {
      global.gc();
    }
  }
}

4. メモリリークの検出

1
2
3
4
5
6
7
// heapdumpを使用
const heapdump = require('heapdump');

// 定期的にヒープダンプを取得
setInterval(() => {
  heapdump.writeSnapshot(`./heap-${Date.now()}.heapsnapshot`);
}, 60000);

5. ビルドツールの設定

1
2
3
4
5
6
7
8
# webpack
node --max-old-space-size=4096 node_modules/.bin/webpack

# Vite
NODE_OPTIONS="--max-old-space-size=4096" npm run build

# TypeScript
NODE_OPTIONS="--max-old-space-size=4096" tsc

関連エラー

関連エラー

Node.js の他のエラー

最終更新: 2025-12-17