https://blog.platformatic.dev/optimizing-nodejs-performance-v8-memory-management-and-gc-tuning
Node.js で短命なオブジェクトが多く作られるようなアプリケーションを実行すると、GCがパフォーマンスを低下させる可能性があることを解説した記事。以下、重要そうな部分をピックアップしたメモ。
- Next.js のようにSSRを行うアプリケーションは、一時的なオブジェクトが大量に生成され、(短命であるにも関わらず)New Space の GC を2回乗り越えてしまい、Old Space に移行してしまう場合がある。
- New Space は Scavenge アルゴリズムで高速に行われるが、Old Space は Mark and Sweep アルゴリズムで行われるため低速である。
- 一時的なオブジェクトのGCが、コストの掛かる Mark and Sweep アルゴリズムで行われ、パフォーマンスが低下してしまう場合がある
- 一時的なオブジェクトが大量に Old Space に移行されるので、高い頻度で Old Space の GC が発生してしまうため
- 複雑なReactのウェブサイトの場合、サーバー上でレンダリングするために約3000のオブジェクトを割り当てるらしい(メモリは5-10MB)
a complex React website would allocate around 3000 objects to render a page on the server. This would result in 5-10MB in memory.
--max-semi-space-size
を設定することで、パフォーマンスチューニング可能
- Node v22+ ではメモリの割当ロジックが変更され、Kubernetes などでメモリ割り当てが少ない(512MB〜2GB)場合には不利に働く可能性があるとのこと