Another technique to execute Java programs is with a compiler that translates the Java byte codes into native machine code. Like traditional high-level language compilers, a direct Java compiler starts with an application’s Java source code (or, alternatively, with its byte code) and translates it directly into the machine language of the target processor. The JIT compilers, on the other hand, are dynamically invoked compilers that compile the Java byte code during runtime. These compilers can apply different optimizations to speed up the execution of the generated native code. We discuss some common Java-specific compiler optimizations in 3.2.1. The subsequent sections describe the various Java compilers and their specific features.