Skip to content

--max-semi-space-size doc is wrong after Node 18 #55487

Closed
@joebowbeer

Description

@joebowbeer

Affected URL(s)

https://github.com/nodejs/node/blob/main/doc/api/cli.md#--max-semi-space-sizesize-in-mib

Description of the problem

The docs read:

The default value is 16 MiB for 64-bit systems and 8 MiB for 32-bit systems. To get the best configuration for your application, you should try different max-semi-space-size values when running benchmarks for your application.

This may have been true in Node 18 but in the newer version of v8 (11.3) used in Node 20, the default scales with the memory limit, and will generally be less than this documented value.

See https://blog.ztec.fr/en/2024/post/node.js-20-upgrade-journey-though-unexpected-heap-issues-with-kubernetes/

Running the example from the docs on Node 18:

docker run -it -m 2g \
  -e NODE_OPTIONS="--max-old-space-size=1536" \
  node:18 node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
1584

1584-1536 = 48MB = 3 x max-semi-space-size

Now in Node 20:

docker run -it -m 2g \
  -e NODE_OPTIONS="--max-old-space-size=1536" \
  node:20 node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
1560

1560-1536 = 24MB, so max-semi-space-size defaults to 8 here 👈

In order to run with the same heap size limit in Node 20, you must explicitly set the max-semi-space-size:

docker run -it -m 2g \
  -e NODE_OPTIONS="--max-old-space-size=1536 --max-semi-space-size=16" \
  node:20 node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
1584

👉 1584-1536 = 48MB, same as Node 18

Metadata

Metadata

Assignees

No one assigned

    Labels

    docIssues and PRs related to the documentations.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions