Java (JVM) Memory Model
At broad level, JVM Heap memory is physically divided into two parts – Young Generation and Old Generation.
- Young generation is the place where all the new objects are created.
- When young generation is filled, garbage collection is performed.
- This garbage collection is called Minor GC.
- Young Generation is divided into three parts – Eden Memory and two Survivor Memory spaces.
Important Points about Young Generation Spaces:
- Most of the newly created objects are located in the Eden memory space.
- When Eden space is filled with objects, Minor GC is performed and all the survivor objects are moved to one of the survivor spaces.
- Minor GC also checks the survivor objects and move them to the other survivor space. So at a time, one of the survivor space is always empty.
- Objects that are survived after many cycles of GC, are moved to the Old generation memory space.
- Usually it’s done by setting a threshold for the age of the young generation objects before they become eligible to promote to Old generation.
- Old Generation memory contains the objects that are long lived and survived after many rounds of Minor GC.
- Usually garbage collection is performed in Old Generation memory when it’s full.
- Old Generation Garbage Collection is called Major GC and usually takes longer time.
- All the Garbage Collections are “Stop the World” events because all application threads are stopped until the operation completes.
- However Major GC takes longer time because it checks all the live objects.
- Major GC should be minimized because it will make your application unresponsive for the garbage collection duration.
- So if you have a responsive application and there are a lot of Major Garbage Collection happening, you will notice timeout errors.
- Permanent Generation or “Perm Gen” contains the application metadata required by the JVM to describe the classes and methods used in the application.
- Note that Perm Gen is not part of Java Heap memory.
- Perm Gen is populated by JVM at runtime based on the classes used by the application.
- Perm Gen also contains Java SE library classes and methods. Perm Gen objects are garbage collected in a full garbage collection.
- Method Area is part of space in the Perm Gen and used to store class structure (runtime constants and static variables) and code for methods and constructors.
- Memory Pools are created by JVM memory managers to create a pool of immutable objects, if implementation supports it.
- String Pool is a good example of this kind of memory pool.
- Memory Pool can belong to Heap or Perm Gen, depending on the JVM memory manager implementation.
Runtime Constant Pool
- Runtime constant pool is per-class runtime representation of constant pool in a class.
- It contains class runtime constants and static methods.
- Runtime constant pool is the part of method area.
Java Stack Memory
- Java Stack memory is used for execution of a thread.
- They contain method specific values that are short-lived and references to other objects in the heap that are getting referred from the method.
Java Heap Memory Switches
- -Xms – For setting the initial heap size when JVM starts
- -Xmx – For setting the maximum heap size.
- -Xmn – For setting the size of the Young Generation, rest of the space goes for Old Generation.
- -XX:PermGen – For setting the initial size of the Permanent Generation memory
- -XX:MaxPermGen – For setting the maximum size of Perm Gen