240 likes | 256 Views
Overview of the IBM Java Just-in-Time Compiler. Presenters: Zhenhua Liu, Sanjeev Singh. Reference.
E N D
Overview of the IBM Java Just-in-Time Compiler Presenters: Zhenhua Liu, Sanjeev Singh
Reference • “Overview of the IBM Java Just-in-Time”, T. Suganuma, T. Ogasawara, M. Takeuchi, T. Yasue, M. Kawahito, K. Ishizaki, H. Komatsu, T. Nakatani IBM Systems Journal, Volume 39 , No. 1, Pages: 175 – 193, ISSN:0018-8670
Outline • Introduction to JVM • Modifications to JVM(IBM JIT compiler) • Optimization on extended bytecode • Code generation details • Example
Introduction to jvm • What’s JVM(Java Virtual Machine)? • Pros & Cons • Advantage: • Platform-neutrality, flexibility, reusability • Disadvantage: • Performance penalty • Run-time overhead for bytecode instruction fetch & decode Source Code Bytecode Machine Code JVM
Why is JAVA slow? • Many relative small method can lead to more frequent method invocation than other non-OOP languages • Requires run-time exception checking to ensure validity of accesses to objects and arrays • Synchronized methods or synchronized blocks cause run-time overhead by locking a given object for the duration of execution
How to speed up JVM? • Just-in-time (JIT) compiler • Converts the given bytecode instruction sequence at runtime before executing it natively • Pros & Cons of JIT compiler • Reduce overall Run-time overhead • Introduce first-time Compilation overhead, but not afterwards
Structure of Jit compiler Bytecode-level Optimization
Base JVM modification (1/2) • Object layout
Base JVM modification (2/2) • Execution of static initializer • Separate the resolution of a class from the execution of its static initializer • Before Change • A class is resolved at run-time, together with the execution of static initializer. • After Change • A class is resolved at compile-time. The static initializer is executed upon run-time calls.
Selective Compilation • Mixed execution • Interpretation + Compiled Code(JIT-generated code) • Rules (using JIT or not?) • Yes • Hot methods(frequently invoked methods) • Hot branches (frequently traversed branches) • Loops included • No • Only executed once • No loop included
Bytecode-level Optimization • Method inlining
Bytecode-level Optimization • Exception check elimination
Bytecode-level Optimization • Common sub-expression elimination • Scalar Replacement • Replace subscripted variables by local variable references and them available for register allocation • Common effective address generation • Reduce register pressure • Partial redundancy elimination • Reduce the number of accesses to instance variables
The JIT Compiler uses a table with pointers to the methods in the class. • This internal table is used to compile the native code. • Whenever the method is called the address is called. • There is another table which maintains the addresses of the bytecode in case it is needed to be compiled.
Register Allocation • The code is broken into tiles. Each loop is a tile and the code in between loops is another tile. • Local variable usage is collected within each tile and a local variable table is prepared. • 3 types of registers • Stack variable registers • Permanent cached local variable registers • Temporary cached local variable registers • Circular allocation policy • Least recently used register
Idioms in bytecode sequences • A table of frequently appearing bytecode sequences as idioms. • Reduce the stack height of expression evaluation. • Exploits local variable cache registers by avoiding unnecessary move instructions between local and stack variables.
Type inclusion test (1/2) • Checks whether two given types are related by a subclass relationship. • Runtime overhead. • Cache mechanism for type inclusion testing. • Given an object • Null check. • Else, compared with the value of the cache that holds the successful class from the previous test. • Else , JVM runtime library is checked and cache updated.
Exception handling (1/2) • When an exception occurs, the JVM searches for the handler of the current method. • If not found, it pops the last frame off the stack and searches for the handler of the next method on the stack • Till a handler is found or no more frames on the stack.
Exception handling (2/2) • For known exceptions: • Each method is registered in an exception registration record. • It is done for only those methods which have a try/catch block. • It maintains an exception chain. • During exceptions,a conditional jump is created to the bottom of the code.
Code scheduling • Most code scheduling algorithms for static compilation, when the compilation time is not important. • A code scheduler works with the code generator for a basic block. • When a native code is generated, it is given to the scheduler with some attributes, like reference registers, exception flag, address of memory access etc. • The scheduler considers the dependencies and arranges the code. • Has to guarantee proper execution. Cannot reorder two instructions which may raise exceptions.