JVM
(Java Virtual Machine)
JVM (Java Virtual Machine) is an abstract
machine. It is a specification that provides runtime environment in which java
bytecode can be executed.
JVMs are available for many hardware and
software platforms (i.e.JVM is plateform dependent).
What
is JVM?
It is:
- A
specification where working
of Java Virtual Machine is specified. But implementation provider is
independent to choose the algorithm. Its implementation has been provided
by Sun and other companies.
- An
implementation Its
implementation is known as JRE (Java Runtime Environment).
- Runtime
Instance Whenever you
write java command on the command prompt to run the java class, and
instance of JVM is created.
What
it does?
The JVM performs following operation:
- Loads
code
- Verifies
code
- Executes
code
- Provides
runtime environment
JVM provides definitions for the:
- Memory
area
- Class
file format
- Register
set
- Garbage-collected
heap
- Fatal
error reporting etc.
Internal
Architecture of JVM
It contains
classloader, memory area, execution engine etc.
|
Class Loader
The JVM uses different class loaders organized into the
following hierarchy:
- The bootstrap class loader is the
parent for other class loaders. It loads the core Java libraries and is
the only one written in native code.
- The extension class loader is a
child of the bootstrap class loader. It loads the extension libraries.
- The system class loader is a child
of the extension class loader. It loads the application class files that
are found in the classpath.
- A user-defined class loader is a
child of the system class loader or another user-defined class loader.
When a class loader receives a request to load a class,
it checks the cache to see if the class has already been loaded, then delegates
the request to the parent. If the parent fails to load the class, then the
child attempts to load the class itself. A child class loader can check the
cache of the parent class loader, but the parent cannot see classes loaded by
the child. The design is such because a child class loader should not be
allowed to load classes that are already loaded by its parent.
Execution Engine
The execution engine executes commands from the bytecode
loaded into the data areas one by one. To make the bytecode commands readable
to the machine, the execution engine uses two methods.
- Interpretation. The execution engine changes each command to
machine language as it is encountered.
- Just-in-time (JIT) compilation. If a method is used frequently, the
execution engine compiles it to native code and stores it in the cache.
After that, all commands associated with this method are executed directly
without interpretation.
Memory Model
The Java memory model is built on the concept of
automatic memory management. When an object is no longer referenced by an
application, a garbage collector discards it and this frees up memory. This is
different from many other programming languages, where you have to manually
unload the object from memory.
The JVM allocates memory from the underlying OS and
separates it into the following areas.
- Heap Space. This is a shared memory area used to hold the
objects that a garbage collector scans.
- Method Area. This area was previously known as the permanent generation
where loaded classes were stored. It has recently been removed from the
JVM, and classes are now loaded as metadata to native memory of the
underlying OS.
- Native Area. This area holds references and variables of
primitive types.
Breaking the heap up into generations ensures efficient
memory management because the garbage collector does not need to scan the whole
heap. Most objects live for a very short time, and those that survive longer
will likely not need to be discarded at all until the application terminates.
When a Java application creates an object, it is stored
in the eden
pool of the heap. Once it is full, a minor garbage collection
is triggered at the eden pool. First, the garbage collector marks dead objects
(those that are not referenced by the application any more) and increments the
age of live objects (the age is represented by the number of garbage
collections that the object has survived). Then the garbage collector discards
dead objects and moves live objects to the survivor pool, leaving the
eden pool clear.
When a surviving object reaches a certain age, it is
moved to the old generation of the heap: the tenured pool. Eventually, the
tenured pool fills up and a major garbage collection is triggered to clean it
up.
When a garbage collection is performed, all application
threads are stopped, causing a pause. Minor garbage collections are frequent,
but are optimized to quickly remove dead objects, which are the major part of
the young generation. Major garbage collections are much slower because they
involve mostly live objects. There are different kinds of garbage collectors,
some may be faster in certain situations when performing a major garbage
collection.
The heap size is dynamic. Memory is allocated to the heap
only if it is required. When the heap fills up, the JVM reallocates more
memory, until the maximum is reached. Memory reallocation also causes the
application to stop briefly.
0 Comments