Minor point, but technically a JIT compiler doesn't replace an interpreter. The latter is still there (written in assembly nowadays), and the VM has to trace hotspots and balance the cost of run time compiling vs. the cost of normal interpretation. Of course a JIT code cache helps to avoid the compilation overhead.