Post on 10-May-2015
description
UnderstandingGarbage Collection(aka Automatic Memory Management)
Douglas Q. Hawkinshttp://www.dougqh.netdougqh@gmail.com
Why?
Leaky Abstraction
2 of 3 Optimization Flags Are For Memory Management
but not about tuning per se
......
HotSpot Collectors
Young
Old
-XX:+UseSerialGC
-XX:+UseParNewGC -XX:+UseParallelGC
-XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC
Serial ParallelScavenge
Serial Old(Mark Compact)
Concurrent Mark & Sweep
ParallelOld
(Mark Compact)
Parallel
TopicsBasic Garbage Collection Strategies & Terminology
Garbage Collection in HotSpot
Garbage Collection in J9 and JRockit
Alternatives to Garbage Collection
Azul C4
Fundamentals
Tasks for a Tracing GCIdentify Live ObjectsRemove Dead ObjectsOptionally, Coalesce Free Space (Compaction)
Stack Frames
Mark & Sweep
Static VariablesSystem.in
System.out
Mark Compact
Allocation
4
8
Copy Collector
Tracing Problem
Random Walk of HeapCache Hostile
Bad Idea on Large Heap
Generational HypothesisBy
tes
Surv
iving
Bytes Allocated
Infants
GenerationalYoung
Old / Tenured
Stack Frames
Static VariablesSystem.in
System.out
Remembered SetYoung
Old
Stack Frames
Static VariablesSystem.in
System.out
GC in Java VMs
HotSpot Garbage CollectorYoung Generation
Old Generation
Eden
S1S0
Young vs Tenured CollectionsBy
tes
Surv
iving
Bytes Allocated
Young Tenured
Which Tracing Strategy?
Low(Young Region) Copy
High(Tenured Region)
Mark & SweepOR
Mark Compact
Liveness Strategy
Object AllocationYoung Generation
Old Generation
Eden
S1S0
TLAB
Minor CollectionYoung Generation
Old Generation
Eden
S1S0
TLAB
1 2
Major CollectionYoung Generation
Old Generation
Eden
S1S0
Permanent GenerationYoung Generation
Old Generation
Eden
S1S0
Permanent Generation
Bootstrap App Server Web Application
C C C C C C C C
Demo
https://visualvm.dev.java.net/plugins.htmlhttps://visualvm.dev.java.net/
Tuning
Newer JVMs can adaptively tune,but you may not want to rely on that.
Steady State
8xNewer JVMs can automatically tune,but you may not want to rely on that.
-XX:MaxGCPauseMillis-XX:GCTimeRatio
Meets these goals by adjusting the heap size.
Adaptive Tuning
Maximize Collection during Minor GCsAvoid Major GCs at much as possible
Promote as little as possible
Maximize Available Memory
Adjust for 2 of 3 GC GoalsThroughput
LatencyFootprint
Basic Principles
Stops region resizingwhich would require a full GC
Set Xms = Xmxinitial heap size max heap size
3-4xYoung (Xmn): 1-1.5x
Old: 2-3x
Set XX:PermSize = XX:MaxPermSize
Again, stops region resizingwhich would require a full GC
1.2-1.5x
GC ChoicesSerial ParallelVS.
Stop theWorld Concurrent
Compacting Non-compacting
VS.
Full VS. Incremental
Application Thread GC Thread
ParallelSerial
Stop the World!
Why Stop the World?
0x0C
0x0C
0x0C0x04
0x04
0x04
BJL
Parallel MarkCompact
Application Thread GC Thread
ConcurrentMark & Sweep
Concurrent Marking
Remark
Concurrent Sweep
HotSpot Collectors
Young
Old
-XX:+UseSerialGC
-XX:+UseParNewGC -XX:+UseParallelGC
-XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC
Serial ParallelScavenge
Serial Old(Mark Compact)
Concurrent Mark & Sweep
ParallelOld
(Mark Compact)
Parallel
Application Thread GC Thread
Throughput vs Latency
If Latency is Too High,Switch to ConcMarkSweep
CMS kicks in when old generation is 65% full.
Increase Old Generation an additional 25-30%
When compaction is needed it is serial,so avoid compaction at all costs!
GCs in Other JVMs
J9Nursery
Tenured
SurvivorAllocate
C
JRockitNursery
Tenured
Keep Area Survivor
C C
C
Hybrid Mark Sweep & Copy
To From
New GCs in Java VMs
G1:Garbage First & Balanced
G1 & Balanced GC
Unused Young Old
G1 - Minor Collection
Unused Young Old
Unused Young Old
G1 - Major Collection
Azul C4Continuously Concurrent Compacting Collector
To From
http://www.infoq.com/articles/azul_gc_in_detail
Alternatives to Hard References & GC
WeakReference
WR
WeakReference<Foo> fooRef = new WeakReference<Foo>(foo);Foo foo = fooRef.get();
SoftReference
SR
SoftReference<Foo> fooRef = new SoftReference<Foo>(foo);Foo foo = fooRef.get();
Garbage Collected if Low on Space
Be Careful With ReferencesReference<User> ref = ...if ( ref.get() != null ) { System.out.println(ref.get().getName());}
Possible NullPointerException
Reference<User> ref = ...User user = ref.get();if ( user != null ) { System.out.println(user.getName());}
ConcurrentMap<Key, Graph> graphs = new MapMaker() .concurrencyLevel(4) .weakKeys() .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .makeComputingMap( new Function<Key, Graph>() { public Graph apply(Key key) { return createExpensiveGraph(key); } });
Guava MapMaker & CacheBuilder
PhantomReference
ReferenceQueue
PR
X
Direct ByteBuffersByteBuffer buffer = ByteBuffer.allocateDirect(...);
Additional Reading
The Garbage Collection HandbookBy Richard Jones, Antony Hoskin, Eliot Moss
http://www.amazon.com/The-Garbage-Collection-Handbook-Management/
Memory Management in theHotSpot Java Virtual Machinehttp://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf
By Charlie Hunt and Binu John
Java Performance
http://www.amazon.com/Java-Performance-Charlie-Hunt/
http://www.infoq.com/presentations/JVM-Performance-Tuning-twitterBy Attila Szegedi
Everything I Ever Learned AboutJVM Performance Tuning
Questions?Thanks, please fill out your evaluations!
Douglas Q. Hawkinshttp://www.dougqh.netdougqh@gmail.com