Also, because information about the code is available during runtime, a lot of extra optimizations can be done which aren't possible in C++ (for example, virtual functions can be inlined as the JIT compiler knows that a specific class is the most derived type of it's kind, which can't be done in C++ as the loading of dynamic libraries can introduce new derived types the compiler never knew about).
However, one major disadvantage of Java and .Net is that you don't have access to some of the CPU instructions using intrinsics - especially SIMD comes to mind. It's very hard to optimize general scalar code into SIMD instructions. Most C++ compilers support SIMD intrinsics, which enable beatiful created vector and matrix classes to compile to only a few inlined SIMD instructions. This is a major advantage over the current Java and .Net implementations.