We also encourage you to check out IBM's JVM and their JIT-compiler which both are very good. In an adaptively optimizing environment, this may very well be true. If a virtual machine gets a general idea of the memory behavior of the program, optimizations can be made. In a dynamic adaptively optimizing system, we could just increase a pointer in an existing memory space. This is one of the many advantages that we gain over traditional static compilation.
Native threads are the threads the operating system uses.
In traditional implementations of Java, each Java thread is represented as a native thread. This is easy to implement, but generally gets a bit slow. Context switches and scheduling is done internally. Thin threads take up less memory and since we don't need to do kernel calls each time we context switch, this is much faster. If we use several native threads to power different groups of thin threads we also scale really well on both single- and multiprocessor systems.