[小ネタ]Vitest(coverage)で「JavaScript heap out of memory」がでたときの対処方法

2024.05.13

どうも!オペレーション部の西村祐二です。

最近、Vitestに入門しています。

PCに積んでるメモリが少ないわけでもないのに、メモリに関連する「JavaScript heap out of memory」エラーに遭遇しました。

<--- Last few GCs --->

[84933:0x138008000]    58702 ms: Scavenge 4093.3 (4103.9) -> 4092.5 (4104.4) MB, 0.75 / 0.00 ms  (average mu = 0.209, current mu = 0.198) allocation failure; 
[84933:0x138008000]    58718 ms: Scavenge (reduce) 4093.7 (4104.4) -> 4093.0 (4102.9) MB, 1.00 / 0.00 ms  (average mu = 0.209, current mu = 0.198) allocation failure; 


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----
...
...
...

備忘録を兼ねて解決策をブログにしておきます。

環境

  • PC: M2 Max
  • メモリ: 32GB
  • vitest: 1.6.0

解決策

はじめに結論として、coverageの設定に対象とするディレクトリを指定することで解消しました。

vitest.config.mjs

import tsconfigPaths from "vite-tsconfig-paths";
import { defineConfig } from "vitest/config";

export default defineConfig({
  plugins: [tsconfigPaths()],
  test: {
    pool: "forks",
    reporters: ["verbose"],
    coverage: {
      include: ["src/**/*.ts"],
      enabled: true,
      reporter: ["text", "lcov", "html"],
    },
  },
});

原因

私の環境ではvitestのcoverageを有効にしておりました。

同階層にAWS CDKのcdk.outもあり、不要なコードを読み込みにいってるのが原因のようでした。

includeの設定がデフォルトでは['**']となっているのを、正しいpathを指定することで解消しました。

https://vitest.dev/config/#coverage-include

ちなみにexcludeはデフォルトで下記設定になっているようでした。こちらをカスタマイズすることでも解消できそうです。

https://vitest.dev/config/#coverage-exclude

さいごに

Vitestで「JavaScript heap out of memory」がでたときの対処方法を備忘録かねてまとめました。

誰かの参考になれば幸いです。