Just a few facts and terms (which I tend to forget or mix up):
Memory
The Sun-JVM process memory consists of the “Permanent Space” and the “Heap".
The Permanent Space (aka Permanent Generation) holds the bytecode of all loaded classes.
MBean (Client-VM):java.lang:type=MemoryPool,name=Perm Gen
MBean (Server-VM):java.lang:type=MemoryPool,name=PS Perm Gen
The “generational” Heap is divided into “Old Generation” and “Young Generation".
MBean:java.lang:type=Memory
(HeapMemoryUsage)The Old Generation (aka Tentured Space) contains long-lived objects and is cleaned only during a major garbage collection.
MBean (Client-VM):java.lang:type=MemoryPool,name=Tenured Gen
MBean (Server-VM):java.lang:type=MemoryPool,name=PS Old Gen
The New Generation (aka New Space) is subdivided into “Eden” and two Survivor Spaces named “From Space” and “To Space".
Eden is for new and short-lived objects. Initial size is usually 32MB or 64MB, may be overwritten with
-XX:NewSize
and-XX:MaxNewSize
.- From Space and To Space contain objects that have survived a minor garbage collection. Initial size is usually 1MB or 2MB each, may be overwritten with
-XX:SurvivorRatio
.
Garbage Collection
A Minor Collection (aka Copy Collection) cleans up Eden and moves the remaining objects up to the survivor spaces (and later into the tentured space)
A Major Collection (aka Stop-the-World Collection, aka Mark-and-Sweep, aka Mark-Sweep-Compact) is executed when a minor collection cannot reclaim enough memory (which should not occur more often than twice an hour) . It cleans up the whole heap (the young generation is empty afterwards).
The available collectors are:
Serial Collector (default on Client-VM)
-XX:+UseSerialGC
minor MBean:java.lang:type=GarbageCollector,name=Copy
major MBean:java.lang:type=GarbageCollector,name=MarkSweepCompact
Parallel Collector (aka Throughput Collector, default on Server-VM)
-XX:+UseParallelGC
minor MBean:java.lang:type=GarbageCollector,name=PS Scavenge
major MBean:java.lang:type=GarbageCollector,name=PS MarkSweep
Parallel Compacting Collector
-XX:+UseParallelOldGC
- Concurrent Mark-Sweep Collector (aka Low-Latency Collector)
-XX:+UseConcMarkSweepGC
(Note: all data refer to Java 6)
Recommended memory sizes (Steven Haines, Java 5):
- Hint: allocate the heap at once (i.e.
-Xms1024m -Xmx1024m
for a 1GB heap) - Young generation: a little less than half the heapsize (i.e.
-XX:NewSize=448m -XX:MaxNewSize=448m
for a 1GB heap) - Each survivor space: 1/8 of the young generation (i.e.
-XX:SurvivorRatio=6
) - Permanent space: start with 128MB, max 256MB (i.e.
-XX:PermSize=128m -XX:MaxPermSize=128m
) - this value is not part of the heap!
See also: