- In V8
null
,undefined
,true
andfalse
internally are heap allocated objects. If you are comming from Java you can say thattrue
andfalse
in V8 are more likeBoolean.TRUE
andBoolean.FALSE
in Java. - There is an important difference between real local variables and variables that are captured by closures or shadowed by eval/with. Captures variables are stored in a special heap allocated structure called Context and are accessed indirectly. For more details about real vs. context allocates variables see my answer to a different question
-
V8 has two compilers: non-optimizing (aka full) and optimizing one:
- Non-optimizing compiler can’t store floating point numbers and integers beyond 31-bit (32-bit on x64) on the stack it always boxes them into HeapNumbers. It does not try to do register allocation and stores real local variables on the stack.
- Optimizing compiler is much smarter. It does register allocation (linear scan) and can keep full 32-bit integers and floating point numbers on the stack and in the registers (including XMM registers).
-
Speaking of JVM: it can perform so called stack allocation and allocate a non-escaping object on the stack instead of the heap. A more generic optimization (scalar replacement) can sometimes completely eliminate allocation of non-escaping object and explode it into separate fields.