Java Virtual Machine(JVM)

What is JVM?

JVM stands for Java Virtual Machine, which is an abstract machine that provides a run-time environment to run Java programs. It converts Java byte-code into machine language, so not only Java but it also enables the computer to run other programs that are compiled to byte-code.
JVM is a part of the JRE(Java Run Environment). However, the reason for the Java program is executed by the JVM helps to solve the major problems related to web-based programs and also to make it secure.

JVM working process can be explained in the following manner:

  • It first loads byte-code.
  • then verifies the byte-code.
  • Then executes byte-code providing runtime environment.

JVM Architecture:

Java Virtual Machine

1. ClassLoader subsystem:

This subsystem is used for loading class files. It performs three major functions :
Loading, Linking, and Initialization.

There are three built-in classloaders in Java.

  • Bootstrap ClassLoader: It loads the rt.jar file which contains all class files of Java Standard Edition like java.lang package classes, java.net package classes, java.util package classes.
  • Extension ClassLoader: It loads the jar files located inside $JAVA_HOME/jre/lib/ext directory.
  • System ClassLoader: It loads the class files from the classpath. Also known as Application classloader.

2. JVM Memory:

  • Method Area:
    In method area, structures like the run-time constant pool, field and method data, variables information, static variables, etc. are stored.
  • Heap:
    It is a shared resource among all the threads and created during run-time. All the Objects, metadata, and arrays are stored in the heap.
  • JVM language Stacks:
    Java language Stacks stores parameters, local variables and return addresses during method calls. It is not a shared resource. One JVM stack is created simultaneously for each thread that is each thread contains its own JVM stack.
  • PC Registers:
    PC(Program Counter) Register contains/stores the address of JVM(Java Virtual Machine) instruction that is being currently executed. Each thread in Java has its own PC register.
  • Native Method Stacks:
    Every thread has its own separate native stack hold the native method information.

3. Execution Engine:

The execution engine executes the bytecode, reading it line by line.

It contains three parts:

  • Interpreter:
    The work of the interpreter is to read the byte-code line by line and then execute it.
  • Just-In-Time Compiler(JIT):
    It is used to increase the performance of the compiler by taking the block of similar byte-code that is the repeated method calls. Hence reducing the compilation time and making it more efficient.
  • Garbage Collector:
    It is used to destroy the useless objects or objects that are no longer required.

4. Java Native Interface (JNI):

It provides the native libraries required for the execution of a program. It allows the JVM to call other Libraries like C, C++, Assembly, etc., providing the interface to interact with other Native Application.

5. Native Method Libraries:

This is a collection of the Native Libraries(C, C++) which are required by the Execution Engine.