A Just In Time (JIT) Compiler converts ByteCode to executable machine instructions on the fly. As a consequence, it differs in subtle ways from a traditional compiler. First off, since many problems (example, RegisterAllocation) are computationally complex, a JIT Compiler uses fast heuristics instead of well established, but slower, algorithms. This may result in sub-optimal results. However, as a benefit, JIT Compilers have access to the code as it is running, and as such may dynamically determine code segments to be optimized to a greater degree.
Examples of JIT Compilers include: