Memory pressure.
Allocates 50 MB chunks until the JS heap pushes back. Reports total MB allocated without stall.
Per-tab heap limits: Chrome ~4 GB, Firefox ~2 GB, iOS Safari ~1.5 GB, Android Chrome varies. This won't hit your full RAM ceiling — it reveals the tab limit.
On each iteration we new Uint8Array(50 * 1024 * 1024) and walk every 4 KB to force the OS to back the pages with real RAM. If the allocator throws, we stop and report the previous total.
We cap at 32 iterations (1.6 GB) so the test always terminates. After we're done, the references are cleared and the GC reclaims everything in 1-3 seconds.