V8 developer here. I can confirm that 2^24 is the maximum number of entries in a Map
. That’s not a bug, it’s just the implementation-defined limit.
The limit is determined by:
- The
FixedArray
backing store of theMap
has a maximum size of 1GB (independent of the overall heap size limit) - On a 64-bit system that means 1GB / 8B = 2^30 / 2^3 = 2^27 ~= 134M maximum elements per
FixedArray
- A
Map
needs 3 elements per entry (key, value, next bucket link), and has a maximum load factor of 50% (to avoid the slowdown caused by many bucket collisions), and its capacity must be a power of 2. 2^27 / (3 * 2) rounded down to the next power of 2 is 2^24, which is the limit you observe.
FWIW, there are limits to everything: besides the maximum heap size, there’s a maximum String
length, a maximum Array
length, a maximum ArrayBuffer
length, a maximum BigInt
size, a maximum stack size, etc. Any one of those limits is potentially debatable, and sometimes it makes sense to raise them, but the limits as such will remain. Off the top of my head I don’t know what it would take to bump this particular limit by, say, a factor of two — and I also don’t know whether a factor of two would be enough to satisfy your expectations.