In this article, I am going to discuss JVM Architecture in detail. Please read our previous article where we discussed Java Packages with Examples. At the end of this article, I am sure you will understand the internal architecture of JVM.
When we compile the Java program, first it will check whether the java program or code is valid or invalid. If the program is valid then the compiler will generate .class file which contains byte code instructions. Byte code instructions are the special java instructions that are ready to convert into machine code instructions. These byte code instructions are executed by JVM (Java Virtual Machine).
ClassLoader Sub System
The Class Loader subsystem is the first program available in JVM which is responsible for loading .class file into JVM. Before loading .class file into JVM it will check whether the .class file is containing valid byte code or not by using a program called “byte code verifier”. If byte code is valid then it will load .class file into JVM otherwise it won’t load .class file.
Run-Time Data Areas
If byte code is valid the ClassLoader subsystem will load .class file into following five Run-Time Data Areas of JVM.
Method Area contains all Class Code, Method Code immediate parent class name, methods, and variables information, etc. are stored, including static variables. There is only one method area per JVM, and it is a shared resource.
Heap Memory area contains all the created objects. There is also one Heap Area per JVM. It is also a shared resource.
Java Stack contains all the methods which are under execution. Java Stack is a collection of different frames where each frame contains exactly one method.
PC (Program Counter) Register
PC (Program Counter) register contains the address of the next instruction to be executed. The value of the PC (Program counter) Register will be incremented automatically.
Native Java Stack
Native Java Stack contains all the native methods which are under execution.
Native Library is a collection of all predefined non-java methods or native methods. The native method is a method that is written in non-java languages like C, C++.
Java Native Interface
Java Native Interface is responsible to load the required Native Methods into Java Native Stack. Sometimes we also use Java Native Interface for loading the required Native Methods into Execution Engine.
Execution Engine is responsible for converting byte code instructions into machine code instructions. Execution Engine contains the following two parts,
- JIT Compilers
Here, both programs are used at the same time so that performance will be improved.
It interprets the bytecode line by line and then executes it. The disadvantage here is that when one method is called multiple times, every time interpretation is required.
JIT (Just In Time) Compiler
It is used to increase the efficiency of the interpreter. It compiles the entire bytecode and changes it to native code so whenever the interpreter sees repeated method calls, JIT provides direct native code for that part so re-interpretation is not required, thus efficiency is improved.
Note: Code is executed by JIT compilers called “java hotspots”.
In the next article, I am going to discuss Java IO Streams in detail with examples. Here, in this article, I try to explain JVM Architecture in detail. I hope you enjoy this article. I would like to have your feedback. Please post your feedback, question, or comments about this article.