Earlier quoted context omitted.
Yeah -- I knew about the virtual heap arrays, so the GC explanation didn't make sense. I'll dig into it; thanks for the pointers. I think you're right though. Once it's been running a while, it seems OK; so I think it was JIT compilation pauses.
We've been testing out ammo.js (Emscripten compiled Bullet) for 3D physics. In this demo http://apps.playcanvas.com/will/ammo/crates after the first couple of resets, it runs smoothly. It does indeed seem to be the JIT warming up. The good news is that Chrome Canary is significantly smoother, so 6-8 weeks until that hits stable.
Wow, yeah. That's a much more dramatic demonstration. Looks great though, once it warms up.