5
1 | Article by Subnesh Sharma | Java Virtual Machine This article intends to reveal the most hidden, interesting and knowledgeable things about JVM and its components. Across the globe, there are multiple articles on JAVA, its API and implementation but very few literatures are written on JVM. Not many JAVA professional make an attempt to understand the intricacies of internal working of Java Virtual Machine. So let’s get a deep insight of JVM and Its components. The agenda of this paper would be: Agenda: 1. What is JVM? 2. JVM subcomponents 2.1 Execution Engine 2.2 Class Loader 2.3 Method Area 3. Summary 1. What is JVM? A Java Virtual Machine (JVM) is a self contained operating environment that behaves as if it is a separate computer. Java applets, for example, run in a JVM that has no access to the host operating system. JVM uses a virtual machine model (VMM) for the execution of other computer programs and scripts and it enables a set of computer software programs and data structures to make use of VMM. This model accepts a form of computer intermediate language commonly referred to as Java bytecode. According to Oracle (Sun Mircosystems), a JVM definition is “A software ‘execution engine’ that safely and compatibly executes the byte codes in Java class files on a microprocessor (whether in a computer or in another electronic device)”. According to Oracle (Sun Mircosystems), a Virtual Machine definition is “An abstract specification for a computing device that can be implemented in different ways, in software or hardware. You compile to the instruction set of a virtual machine much like you'd compile to the instruction set of a microprocessor. The Java virtual machine consists of a bytecode instruction set, a set of registers, a stack, a garbage-collected heap, and an area for storing methods.” VM model emulates the physical computer so as to execute the bytecode. Java works on WORA: “write once, run anywhere” concept. This is implements though JVM which is a software for non virtual hardware and for standard operating systems. JVM comes along with a set of libraries which implement JAVA API’s and constitutes JRE (Java Runtime Environment). This environment can also be used to compile and execute the code of other language like Ada.

Java Virtual Machine - Internal Architecture

  • Upload
    subnesh

  • View
    238

  • Download
    3

Embed Size (px)

DESCRIPTION

Objective of this article is to share internal architecture details of Java Virtual Machine. Focuses on: - How many component does JVM has? - How these component are integrated? - How processing takes place at run time for classes?

Citation preview

Page 1: Java Virtual Machine - Internal Architecture

1

| Article by Subnesh Sharma |

Java Virtual Machine

This article intends to reveal the most hidden, interesting and knowledgeable things about JVM and

its components. Across the globe, there are multiple articles on JAVA, its API and implementation

but very few literatures are written on JVM. Not many JAVA professional make an attempt to

understand the intricacies of internal working of Java Virtual Machine. So let’s get a deep insight of

JVM and Its components. The agenda of this paper would be:

Agenda:

1. What is JVM?

2. JVM subcomponents

2.1 Execution Engine

2.2 Class Loader

2.3 Method Area

3. Summary

1. What is JVM?

A Java Virtual Machine (JVM) is a self contained operating environment that behaves as if it is a separate

computer. Java applets, for example, run in a JVM that has no access to the host operating system.

JVM uses a virtual machine model (VMM) for the execution of other computer programs and scripts and it

enables a set of computer software programs and data structures to make use of VMM. This model accepts a

form of computer intermediate language commonly referred to as Java bytecode.

According to Oracle (Sun Mircosystems), a JVM definition is “A software ‘execution engine’ that safely and

compatibly executes the byte codes in Java class files on a microprocessor (whether in a computer or in

another electronic device)”.

According to Oracle (Sun Mircosystems), a Virtual Machine definition is “An abstract specification for a

computing device that can be implemented in different ways, in software or hardware. You compile to the

instruction set of a virtual machine much like you'd compile to the instruction set of a microprocessor. The

Java virtual machine consists of a bytecode instruction set, a set of registers, a stack, a garbage-collected

heap, and an area for storing methods.” VM model emulates the physical computer so as to execute the

bytecode.

Java works on WORA: “write once, run anywhere” concept. This is implements though JVM which is a

software for non virtual hardware and for standard operating systems.

JVM comes along with a set of libraries which implement JAVA API’s and constitutes JRE (Java Runtime

Environment). This environment can also be used to compile and execute the code of other language like Ada.

Page 2: Java Virtual Machine - Internal Architecture

2

| Article by Subnesh Sharma |

In industry, JVM flavors are distributed by many vendors like Oracle, IBM, HP etc. These all flavors are

following the JVM specification published by Sun/Oracle.

2. JVM Subcomponents

After getting the conceptual understanding of JVM, let focus on its internal architecture:

Virtual machine instance is composed of subsystems, memory areas, data types, and instructions. These

components make an abstract inner architecture for the abstract Java virtual machine. The purpose of these

components is to define the behavior of JVM implementation towards the external resources rather than

implementation of internal architecture.

The specification defines the required behavior of any Java virtual machine implementation in terms of these

abstract components and their interactions.

JVM is composed of two major sub components

1. Execution engine

2. Class Loaders

2.1 Execution engine: it’s responsible for executing the instructions contained in the methods of

loaded classes

2.2 Class Loader: a mechanism for loading types (classes and interfaces) given fully qualified names.

Page 3: Java Virtual Machine - Internal Architecture

3

| Article by Subnesh Sharma |

Class loaders are of two types:

2.2.1 System class loader

2.2.2 Custom Class loader

Following diagram shows the level of class loader

Bootstrap Class Loader is responsible to load all the prerequisites classes and interface to

accomplish the loading activity so as to launch application.

Ext class loader is used to load custom class loader which affects the loading process of all

applications for this JVM. The destination of this jar file is under “JRE_HOME/lib/ext” and it introduces global

customization to loading process.

App class loader is used to load custom class loader for this application only.

Custom Class Loaders are derived from java.lang.ClassLoader class. To load a class use loadClass()

method with appropriate parameters.

2.3 Method Area

JVM architecture consists of run time data area which contains components like method area, heap, method

stacks, thread stack frames, java stacks etc.

Method area is a vital part of run time data area. Inside a Java virtual machine instance, information

about loaded types is stored in a logical area of memory called the method area. When the Java virtual

machine loads a type, it uses a class loader to locate the appropriate class file. The class loader reads in the

class file--a linear stream of binary data--and passes it to the virtual machine. The virtual machine extracts

information about the type from the binary data and stores the information in the method area. Memory for

class (static) variables declared in the class is also taken from the method area.

Heap, again a vital and very important component of run time data area, contains all allocated

objects and references of these objects are kept in Method tables in Method area for JVM use and access.

Bootstrap Class Loader

Ext Class Loader

App Class Loader

Page 4: Java Virtual Machine - Internal Architecture

4

| Article by Subnesh Sharma |

Java Stacks automatically gets create when a new thread is generated. These stacks are composed of

multiple stack frames which internally keep local variables and partial results, and play a part in method

invocation and return.

The Java virtual machine can support many threads of execution at once. Each Java virtual machine

thread has its own pc (program counter) register. At any point, each Java virtual machine thread is executing

the code of a single method, the current method for that thread. If that method is not native, the pc register

contains the address of the Java virtual machine instruction currently being executed. If the method currently

being executed by the thread is native, the value of the Java virtual machine's pc register is undefined. The

Java virtual machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific

platform.

Native method stacks are in use when java application is going to interact with some native codes.

These stacks can be used by the implementation of an interpreter for the Java virtual machine's instruction

set in a language such as C and that’s why these conventional stacks are colloquially called "C stacks”.

Apart from these components, there are some more components which are playing magic games for

the execution of java application. These components are given below:

Byte Code Verifier:

The JVM verifies all bytecode before it is executed. Verification process includes the verification of

the magic number which is generated by “javac” compiler at the time of compilation. This

verification consists primarily of three types of checks:

Branches are always to valid locations

Data is always initialized and references are always type-safe

Access to "private" or "package private" data and methods is rigidly controlled.

First two activities happen when verification process is going on where as last activity happens

dynamically.

JIT Compiler:

The simplest tool used to increase the performance of an application is the Just-In-Time (JIT)

compiler. A JIT is a code generator that converts Java bytecode into native machine code. Java programs

invoked with a JIT generally run much faster than when the bytecode is executed by the interpreter. The Java

Hotspot VM removes the need for a JIT compiler in most cases however JIT compiler being used in earlier

releases still.

3. Summary Understanding of internal architecture of JVM will definitely help to better know the behavior of JVM in

different situations. These details must have revealed hidden facts about JVM and how java based programs

run and get executed. Keep learning!

Page 5: Java Virtual Machine - Internal Architecture

5

| Article by Subnesh Sharma |

Bibliography:

http://www.oracle.com/technetwork/java/index.html

www.artima.com