JVM(Java Virtual Machine)
JVM Architecture: JVM is the heart of any
Java based Application Server. We face most of the issues due to incorrect JVM
tuning. It is very important to understand the Overall architecture of the JVM
in order to trouble shoot different JVM tuning related issues. Here we are
going to discuss the Architecture and the Major parts of a Java Process And the
Java Heap Division.
The Following Diagram is
just a basic overview of a Java Process in a 2 GB process Size Machine. Usually
in 32 bit Windows Operating Systems the default process size will be 2 GB (In
Unix based 64 bit operating Systems it can be 4GB or more). So i draw the
following Diagram of Java Process to explain the Java Process partitions in a
2Gb process size machine.
In the above diagram we will find different partitions of a Java Process. Please compare the above diagram with below descriptions.
.
1) Just for Example we can see
that Process Size is 2048 MB (2GB)
2) The Java Heap Size is
1024MB (means 1GB) -Xmx1024m
3) Native Space = (
ProcessSize – MaxHeapSize – MaxPermSize) It means around 768 MB of Native
Space.
4) MaxPermSpace is around
-XX:MaxPermSize=256m
5) Young Generation Space is
around 40% of Maximum Java Heap.
Different parts of JVM:
1) Eden space: Eden Space is a Part of Java Heap where the
JVM initially creates any objects, where most objects die and quickly are
cleaned up by the minor Garbage Collectors (Note: Full Garbage Collection is
different from Minor Garbage Collection). Usually any new objects created inside
a Java Method go into Eden space and the objects space is reclaimed once the
method execution completes. Where as the Instance Variables of a Class usually
lives longer until the Object based on that class gets destroyed. When Eden
fills up it causes a minor collection, in which some surviving objects are
moved to an older generation.
2) Survivor Spaces: Eden
Space has two Survivor spaces. One survivor space is empty at any given time.
These Survivor Spaces serves as the destination of the next copying collection
of any living objects in Eden and the other survivor space.
The parameter SurvivorRatio
can be used to tune the size of the survivor spaces.
-XX:SurvivorRatio=6 sets
the ratio between each survivor space and Eden to be 1:6
If survivor spaces are too
small copying collection overflows directly into the tenured generation.
3) Young Generation:
(-XX:MaxNewSize): Till JDK1.3 and 1.4 we used to set the Young Generation
Size using -XX:MaxNewSize. But from JDK1.4 onwards we set the
YoungGeneration size using (-Xmn) JVM option.
Young Generation size is
controlled by NewRatio. It means setting -XX:NewRatio=3 means that the
ratio between the Old Generation and the Young Generation is 1:3.
Similarly -XX:NewRatio=8 means that 8:1 ratio of tenured and young generation.
NewRatio: NewRatio is actually the
ratio between the (YoungGenaration/Old Generations) has default values of 2 on
Sparc , 12 on client Intel, and 8 everywhere else.
NOTE: After JDK 1.4 The Young
Generation Size can be set using (-Xmn) as well.
1) Virtual space-1:(MaxNewSize – NewSize): The First Virtual Space is
actually shows the difference between the -XX:NewSize and -XX:MaxNewSize.
Or we can say that it is basically a difference between the Initial Young
Size and the Maximum Young Size.
JavaHeapArea:( -Xmx and –Xms): Java Heap is a Memory area
inside the Java Process which holds the java objects. Java Heap is a
combination of Young Generation Heap and Old Generation Heap. We can set the
Initial Java Heap Size using -Xms JVM parameter similarly if we want to set the
Maximum Heap Size then we can use -Xmx JVM parameter to define it.
Example:
-Xmx1024m —> Means Setting
the Maximum limit of Heap as 1 GB
-Xms512m —> Means setting Java
Heap Initial Size as 512m
.
NOTE-1): It is always recommended
to set the Initial and the Maximum Heap size values as same for better
performance.
NOTE-2): The Theoretical limitation
of Maximum Heap size for a 32 bit JVM is upto 4GB. Because of the Memory
Fragmentation, Kernel Space Addressing, Swap memory usages and the Virtual
Machine Overheads are some factors JVM does not allow us to allocate whole 4GB
memory for Heap in a 32 bit JVM. So usually on 32-bit Windows Operating Systems
the Maximum can be from 1.4 GB to 1.6 GB.
If we want a larger memory
allocation according to our application requirement then we must choose the
64-bit operating systems with 64 bit JVM. 64-bit JVM provides us a larger
address space. So we can have much larger Java Heap with the
increased number of Threads allocation area. Based on the Nature of your
Operating system in a 64 bit JVM you can even set the Maximum Heap size upto
32GB.
Example:
-Xms32g -Xmx32g -Xmn4g
2) Virtual Space-2:
(MaxHeapSize – InitialHeapSize): The Second Virtual Space is actually the
Difference between the Maximum Heap size (-Xmx)and the Initial Heap
Size(-Xms). This is called as virtual space because initially the JVM
will allocate the Initial Heap Size and then according to the requirement the
Heap size can grow till the MaxHeapSize.
PermGen Space:
(-XX:MaxPermSize): PermGen is a non-heap memory area where the Class Loading
happens and the JVM allocates spaces for classes, class meta data, java
methods and the reference Objects here. The PermGen is independent from the
Heap Area. It can be resized according to the requirement using -XX:MaxPermSize
and -XX:PermSize JVM Options. The Garbage collection happens in this area
of JVM Memory as well. The Garbage collection in this area is called as “Class
GC”. We can disable the Class Garbage Collection using the JVM Option
-noclassgc. if ”-noclassgc” Java Option is added while starting the
Server. In that case the Classes instances which are not required will not be
Garbage collected.
Native Area: Native Memory is an area
which is usually used by the JVM for it’s internal operations and to execute
the JNI codes. The JVM Uses Native Memory for Code Optimization and for loading
the classes and libraries along with the intermediate code generation.
The Size of the Native
Memory depends on the Architecture of the Operating System and the amount of
memory which is already commited to the Java Heap. Native memory is an Process
Area where the JNI codes gets loaded or JVM Libraries gets loaded or the native
Performance packs and the Proxy Modules gets loaded.
There is no JVM Option
available to size the Native Area. but we can calculate it approximately using
the following formula:
NativeMemory = (ProcessSize
– MaxHeapSize – MaxPermSize)
Where is the "Java Process Architecture Diagram"
ReplyDeleteThe missing image is attached now. Thanks ..
DeleteBlueHost is definitely one of the best website hosting provider for any hosting plans you need.
ReplyDeleteyou have written an excellent blog.. keep sharing your knowledge...
ReplyDeleteRobot Framework Test Automation Training in Chennai
Robot Framework Test Automation Course in Chennai
Robot Framework Test Automation Online Training
Robot Framework Test Automation Online Course
Great Content. Thanks for sharing this valuable information. It will be useful for knowledge seekers.
ReplyDeleteScrum Master Certification In Chennai
CSM Training In Bangalore
Scrum Master Certification Online
This post is so usefull and informative.keep updating with more information...
ReplyDeleteWhy Testing Is Necessary
Why Testing Is Necessary