2

I'm aware the maximum length of a JavaScript array is 2^32-1, but regardless of how much memory I permit it will still fail to allocate. What's going on? One-line repro:

node --max-old-space-size=100000 -e "console.log(v8.getHeapStatistics().total_available_size);Array.from({ length: Math.pow(2, 32)-1 })"

For clarity the above example exposes 100GB to v8, which is confirmed via total_available_size. 8GB might be sufficient for testing this operation since most people won't have 100GB, but it'll fail regardless. Is this a bug in V8?

1 Answer 1

4

(V8 developer here.)

No, it's not a bug, just an implementation-defined limit. V8 has an internal limit of ~1GB for any individual heap object. At 4 bytes (with pointer compression) per element, that means a maximum of ~256M elements per array.

There are plenty of other implementation-defined limits, e.g. for TypedArray length, string length, BigInt size, recursion depth, number of parameters per function, number of entries in a Map, etc. Pretty much everything has a limit, even if the JavaScript spec doesn't mention it explicitly, or mentions a theoretical limit that's different from implementation limits (which are implicitly assumed to exist).

Sign up to request clarification or add additional context in comments.

1 Comment

That's a bummer not being able to utilize available memory, but I appreciate the detailed answer!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.