Understanding JVM
Aparna Chaudhary
Friday, October 4, 13
Slide 2
Slide 2 text
What’s inside my VM?
VM
Memory
VM
Memory
Friday, October 4, 13
Slide 3
Slide 3 text
What’s inside my VM?
VM
Memory
Guest OS Memory
VM
Memory
Guest OS Memory
Friday, October 4, 13
Slide 4
Slide 4 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
VM
Memory
Guest OS Memory
JVM Memory
Friday, October 4, 13
Slide 5
Slide 5 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Friday, October 4, 13
Slide 6
Slide 6 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
Friday, October 4, 13
Slide 7
Slide 7 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Friday, October 4, 13
Slide 8
Slide 8 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Initial
-Xms
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Initial
-Xms
Friday, October 4, 13
Slide 9
Slide 9 text
What’s inside my VM?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Initial
-Xms
-Xmx
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Initial
-Xms
-Xmx
Friday, October 4, 13
Slide 10
Slide 10 text
Exception in thread "main": java.lang.OutOfMemoryError:
Java heap space
Exception in thread "main": java.lang.OutOfMemoryError:
PermGen space
Exception in thread "main": java.lang.OutOfMemoryError:
GC overhead limit exceeded
Exception in thread "main": java.lang.OutOfMemoryError:
Unable to create new native thread
and more...
OutOfMemoryError
Friday, October 4, 13
Slide 11
Slide 11 text
Exception in thread "main":
java.lang.OutOfMemoryError: PermGen Space
OutOfMemoryError
Friday, October 4, 13
Slide 12
Slide 12 text
Perm Gen Space
Used for Storing the JVM’s internal
representation of Java Classes
Friday, October 4, 13
Slide 13
Slide 13 text
Life of a class
described by
loaded by
references
references
Object
Class
Classl
oader
described by
loaded by
references
references
Object
Class
Classl
oader
Friday, October 4, 13
Slide 14
Slide 14 text
Life of a class
described by
loaded by
references
references
Object
Class
Classl
oader
references
described by
loaded by
references
references
Object
Class
Classl
oader
references
Friday, October 4, 13
Slide 15
Slide 15 text
Life of a class
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Friday, October 4, 13
Slide 16
Slide 16 text
Life of a class
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Friday, October 4, 13
Slide 17
Slide 17 text
Life of a class
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Object
Class
Classloader1
references
references
Object
Class
Classloader2
references
references
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Class
Friday, October 4, 13
Slide 18
Slide 18 text
OOM - PermGen
This occurs when JVM wants to load new class
definitions; but there is not enough space in
PermGen space
Friday, October 4, 13
Slide 19
Slide 19 text
OOM - PermGen
Symptom
At server startup
Cause
Bigger PermGen footprint
Resolution
Increase PermGen capacity -XX:MaxPermSize
Friday, October 4, 13
Slide 20
Slide 20 text
OOM - PermGen
Symptom
PermGen space increases gradually
Cause
Possible classloader leak
Resolution
Investigate any third party API you are using
for any potential class loader leak defect
Friday, October 4, 13
Slide 21
Slide 21 text
OOM - PermGen
Symptom
OOM after deploy-redeploy cycles
Cause
Possible classloader leak in the App Server
Resolution
Someone should fix it for you. Hmm..where is
EAP?
Friday, October 4, 13
Slide 22
Slide 22 text
OutOfMemoryError
Exception in thread "main":
java.lang.OutOfMemoryError: GC overhead
limit exceeded
Friday, October 4, 13
Slide 23
Slide 23 text
OOM - GC overhead
limit exceeded
Policy to allow the VM to detect potential
OutOfMemoryError conditions earlier and before
it runs out of Java Heap space.
Can be turned off -XX:-UseGCOverheadLimit
But don’t!
Friday, October 4, 13
Slide 24
Slide 24 text
OOM - GC overhead
limit exceeded
When is this error triggered?
✓Too many Full GC iterations
✓Too much time spent in GC
Friday, October 4, 13
Slide 25
Slide 25 text
Exception in thread "main":
java.lang.OutOfMemoryError: Unable to
create new native thread
OutOfMemoryError
Friday, October 4, 13
Slide 26
Slide 26 text
OOM - Unable to create
new native thread
JVM is asking a new thread from the OS and
the underlying OS cannot allocate a new
thread anymore.
Friday, October 4, 13
Slide 27
Slide 27 text
Why?
VM
Memory
Guest OS Memory
JVM Memory
PermGen
-XX:MaxPermSize
Stack
-XSS Per Thread
HEAP
Initial
-Xms
-Xmx
not enough
stack
space
Friday, October 4, 13
Slide 28
Slide 28 text
OOM - Unable to create
new native thread
✓Check ulimit - process limit
✓Consider using thread-pools
✓Reduce heap space or perform vertical scaling
Friday, October 4, 13
Slide 29
Slide 29 text
Exception in thread "main":
java.lang.OutOfMemoryError: Java heap
space
OutOfMemoryError
Friday, October 4, 13
Slide 30
Slide 30 text
JVM Heap Structure
Eden S0 S1 Tenured
Old
Generation
Young
Generation
Survivor
Space
Friday, October 4, 13
Slide 31
Slide 31 text
Eden
To From
Survivor Spaces
Object Allocation
Young Gen = Eden + Survivor Spaces
Friday, October 4, 13
Slide 32
Slide 32 text
Eden
To From
Survivor Spaces
Just allocated
are allocated in Eden
Object Allocation
Young Gen = Eden + Survivor Spaces
Friday, October 4, 13
Slide 33
Slide 33 text
Eden
To From
Survivor Spaces
Filling up Eden Space
Friday, October 4, 13
Slide 34
Slide 34 text
Eden
To From
Survivor Spaces
Just allocated
are allocated in Eden
Filling up Eden Space
Friday, October 4, 13
Slide 35
Slide 35 text
Minor GC - Copy referenced
objects
Eden
To From
Survivor Spaces Unreferenced
Referenced
Friday, October 4, 13
Slide 36
Slide 36 text
Minor GC - Copy referenced
objects
Eden
To From
Survivor Spaces Unreferenced
Referenced
Friday, October 4, 13
Slide 37
Slide 37 text
Minor GC - Copy referenced
objects
Eden
To From
Survivor Spaces Unreferenced
Referenced
Friday, October 4, 13
Slide 38
Slide 38 text
Minor GC - Copy referenced
objects
Eden
To From
Survivor Spaces Unreferenced
Referenced
1 1 1 1
Friday, October 4, 13
Slide 39
Slide 39 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
1 1 1 1
Friday, October 4, 13
Slide 40
Slide 40 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
1 1 1 1
Friday, October 4, 13
Slide 41
Slide 41 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
1 1
Friday, October 4, 13
Slide 42
Slide 42 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
1 2
Friday, October 4, 13
Slide 43
Slide 43 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
2 2
Friday, October 4, 13
Slide 44
Slide 44 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
2 2 1
Friday, October 4, 13
Slide 45
Slide 45 text
Next Minor GC - Object Aging
Eden
From To
Survivor Spaces Unreferenced
Referenced
2 2 1 1
Friday, October 4, 13
Slide 46
Slide 46 text
Next Minor GC - Additional
Aging
Eden
To From
Survivor Spaces Unreferenced
Referenced
2 2 1 1
Friday, October 4, 13
Slide 47
Slide 47 text
Next Minor GC - Additional
Aging
Eden
To From
Survivor Spaces Unreferenced
Referenced
2 1
Friday, October 4, 13
Slide 48
Slide 48 text
Next Minor GC - Additional
Aging
Eden
To From
Survivor Spaces Unreferenced
Referenced
3
2
1
Friday, October 4, 13
Slide 49
Slide 49 text
Next Minor GC - Promotion
Eden
From To
Survivor Spaces
Unreferenced
Referenced
3
2
1
1 14
Tenured
Friday, October 4, 13
Slide 50
Slide 50 text
Next Minor GC - Promotion
Eden
From To
Survivor Spaces
Unreferenced
Referenced
3
2
1
1
14
Tenured
Friday, October 4, 13
Slide 51
Slide 51 text
Major GC
Eden
From To
Survivor Spaces
Unreferenced
Referenced
3
2
1
1 1
Tenured
Friday, October 4, 13
Slide 52
Slide 52 text
Major GC
Eden
From To
Survivor Spaces
Unreferenced
Referenced
3
2
1
1 1
Tenured
Friday, October 4, 13
Slide 53
Slide 53 text
Warning!
This knowledge does not make us JVM
experts!
Always focus first on software before
hacking JVM.
Friday, October 4, 13
Slide 54
Slide 54 text
JVM Diagnosis
jmap
jhat
Friday, October 4, 13
Slide 55
Slide 55 text
Class Histogram
jmap -F -histo `pgrep java`
Make it a practice to proactively use this
command after a load test and endurance test.
Friday, October 4, 13