Java Memory Overview
Java Memory overview tutorial intended for java beginners to learn above memory management like memory types etc. In Nutshell, java memory management deals with:
- Allocation of memory to new Object
- Removing unused objects through Automatic Garbage Collection
Heap Memory:
- All objects with new operator are created with in Heap memory.
- Heap memory creates on application startup for every application, therefore JVM heap is different from application heap.
- Garbage collector removes the unused java objects and clears the space
- Heap memory follows into three areas:
- Permanent Generation :
- PermGen space is to store classes, meta information that are required by JVM
- Young Generation : young Gen Memory holds all new objects.
- Aged objects will be move to Old generation and dead objects will be removed very quickly.
- Minor Garbage Collection will be invoked if youngen fills up
- Old Generation : Old Generation stores long run objects.
- Major Garbage Collection will be invoked to removed the unused objects
- Permanent Generation :
Heap Memory Settings:
is there any bench mark to set heap memory for application? We will discuss this. Assume you VM of 8 GB RAM and memory will be calculation follows as:
VM Size | (8GB) | (16 GB) |
Tomcat Max Heap Size (Xms) & (Xmx) | 4096 | 8144 |
Perm Gen | 1024 | 1024 |
Code Cache | 56 | 56 |
Other Mem (Assume 5% of JVM) | 258.8 | 461.2 |
Total JVM (without threads) | 5435 | 9685.2 |
Thread Memory | ||
Space for thread with 1 MB stack | 1119 | 3422 |
Space for thead with 512 KB stack | 2238 | 6844 |
Space for theads with 256 KB stack | 4475 | 13688 |
Suggested Memory Settings are:
VM – 8 GB RAM | VM – 16 GB RAM | Remarks |
-Xms4096m | -Xms8144m | 50% of RAM – Initial Heap Memory |
-Xmx4096m | -Xmx8144m | 50% of RAM – Max Heap |
-XX:NewSize=1024m | -XX:NewSize=1024m | Initial Young Gen Memory |
-XX:MaxNewSize=1024m | -XX:MaxNewSize=1024m | Max Young Gen memory |
-XX:PermSize=256m | -XX:PermSize=256m | Initial PermGen memory |
-XX:MaxPermSize=512m | -XX:MaxPermSize=512m | Max PermGen Memory |
-XX:NewRatio=2 | -XX:NewRatio=2 | NewRatio is the ratio of old generation to young generation. By default it is 2. |
-XX:SurvivorRatio=4 | -XX:SurvivorRatio=4 | controls the size of the two survivor spaces |
-XX:TargetSurvivorRatio=90 | -XX:TargetSurvivorRatio=90 | |
-XX:MaxTenuringThreshold=0 | -XX:MaxTenuringThreshold=0 | |
-XX:+UseParNewGC | -XX:+UseParNewGC | Makes Garbage collection in Parallel using multiple CPU’s. Hence, this Increases application through put and also decreases garbage collection overhead |
-XX:ParallelGCThreads=4 | -XX:ParallelGCThreads=4 | |
-XX:+UseConcMarkSweepGC | -XX:+UseConcMarkSweepGC | Concurrent Mark Sweep Collector – It is good for Long lived objects such as Liferay |
-XX:+CMSParallelRemarkEnabled | -XX:+CMSParallelRemarkEnabled | CMS(Concurrent Mark Sweep Collector – enables multple threads to do garbage collection |
-XX:+CMSCompactWhenClearAllSoftRefs | -XX:+CMSCompactWhenClearAllSoftRefs | |
-XX:CMSInitiatingOccupancyFraction=85 | -XX:CMSInitiatingOccupancyFraction=85 | |
-XX:+CMSScavengeBeforeRemark | -XX:+CMSScavengeBeforeRemark | |
-XX:+CMSConcurrentMTEnabled | -XX:+CMSConcurrentMTEnabled | |
-XX:ParallelCMSThreads=2 | -XX:ParallelCMSThreads=2 |
Standard setenv.sh settings for 8GM RAM:
CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF8 -Djava.net.preferIPv4Stack=true
-Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false
-Duser.timezone=GMT -XX:NewSize=1024m -XX:MaxNewSize=1024m -Xms4096m -Xmx4096m -XX:PermSize=256m -XX:MaxPermSize=512m
-XX:NewRatio=2 -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=0 -XX:+UseParNewGC
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSCompactWhenClearAllSoftRefs
-XX:CMSInitiatingOccupancyFraction=85 -XX:+CMSScavengeBeforeRemark -XX:+CMSConcurrentMTEnabled -XX:ParallelCMSThreads=2
-XX:+UseLargePages -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+UseBiasedLocking -XX:+BindGCTaskThreadsToCPUs
-XX:+UseFastAccessorMethods -XX:+CMSClassUnloadingEnabled -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=172.27.80.15 -Dcom.sun.management.jmxremote.port=18080 -Djava.library.path=/usr/local/apr/lib
-Djava.security.manager -Djava.security.policy=$CATALINA_HOME/conf/catalina.policy"
How to analyze memory settings:
- jconsole
- Java Visualvm