Professional Documents
Culture Documents
Simone Bordet Concurrent Garbage Collectors ZGC Shenandoah
Simone Bordet Concurrent Garbage Collectors ZGC Shenandoah
sbordet@webtide.com
Simone Bordet
● @simonebordet
● sbordet@webtide.com
● Works @ Webtide
○ The company behind Jetty and CometD
simone.bordet@gmail.com 2
Introduction
3
Introduction Stop-The-World
Concurrent
simone.bordet@gmail.com 4
Introduction Stop-The-World
Concurrent
simone.bordet@gmail.com 5
Introduction Stop-The-World
Concurrent
simone.bordet@gmail.com 6
Introduction Stop-The-World
Concurrent
simone.bordet@gmail.com 7
Introduction
● Concurrent GCs
○ GC runs concurrently with the application
simone.bordet@gmail.com 8
Introduction
● Concurrent copying example
Region Region
Header
Header
a=1
simone.bordet@gmail.com 9
Introduction
● Garbage Collector compacts object
Region Region Region
Header Header
f a=1
Header
a=1
simone.bordet@gmail.com 10
Introduction
Header Header
f a=1
Header
a=1
simone.bordet@gmail.com 11
Introduction
● Application writes concurrently
Region Region Region
Header Header
f a=1
Header
a=3
simone.bordet@gmail.com 12
Introduction
● Garbage Collector updates references
Region Region Region
Header Header
f a=1
Header
a=3
LOST WRITE!
simone.bordet@gmail.com 13
Introduction
● Concurrent GCs store object metadata
○ E.g. whether an object has been marked
simone.bordet@gmail.com 14
ZGC
15
ZGC
● Present in OpenJDK 11+
○ Available in AdoptOpenJDK builds
○ Available in Oracle OpenJDK builds
■ From https://jdk.java.net
● Region Based
○ ZPages - similar to G1 regions
■ Small (2 MiB - object size up to 256 KiB)
■ Medium (32 MiB - object size up to 4 MiB)
■ Large (4+ MiB - object size > 4 MiB)
simone.bordet@gmail.com 17
ZGC GC Thread
App Thread
STW
Mark Start
simone.bordet@gmail.com 18
ZGC GC Thread
App Thread
Concurrent
Marking
simone.bordet@gmail.com 19
ZGC GC Thread
App Thread
STW
Mark End
Housekeeping
simone.bordet@gmail.com 20
ZGC GC Thread
App Thread
Concurrent
Processing
simone.bordet@gmail.com 21
ZGC GC Thread
App Thread
STW
Relocate Start
Relocate Roots
simone.bordet@gmail.com 22
ZGC GC Thread
App Thread
Concurrent
Relocation
Relocate Objects
(Compact Heap)
simone.bordet@gmail.com 23
ZGC GC Thread
App Thread
Concurrent
Remapping
Remapping pointers
(Happens During Next Mark)
simone.bordet@gmail.com 24
ZGC
● ZGC solution
○ To avoid races with the application
● Colored Pointers
● Load GC barrier
simone.bordet@gmail.com 25
ZGC
● ZGC colored pointers
○ Color indicates GC metadata
4 color bits
Object address - 44 bits (16 TiB) Unused - 16 bits
simone.bordet@gmail.com 26
ZGC
● ZGC load GC barrier
Object f = obj.field;
<load_barrier>
simone.bordet@gmail.com 27
ZGC
● ZGC load GC barrier
Object f = obj.field;
if (addr_of(f) & wrong_gc_color) {
slow_path()
}
simone.bordet@gmail.com 28
ZGC
● ZGC load GC barrier
Object f = obj.field;
<load_barrier>
simone.bordet@gmail.com 30
ZGC
● ZGC Multi-Mapping
Virtual Memory 001<addr> 010<addr> 100<addr>
Physical Memory
simone.bordet@gmail.com 31
ZGC
● ZGC Multi-Mapping
A
C
B
D
simone.bordet@gmail.com 33
ZGC
● Relocation
E F MetaData
B -> B’
C -> C’
A
D -> D’
C
C’
B
B’ D
D’
simone.bordet@gmail.com 34
ZGC
● Relocation Load Barrier
E F MetaData
E’
B -> B’
C -> C’
A
D -> D’
C
E -> E’
C’
B
B’ D
D’
simone.bordet@gmail.com 35
ZGC
● Relocation
E F MetaData
E’
B -> B’
C -> C’
A
E” D -> D’
C
E -> E’
C’
B
B’ D
D’
simone.bordet@gmail.com 36
ZGC
● Relocation
E F MetaData
E’
B -> B’
C -> C’
A
E” D -> D’
C
E -> E’ E -> E”
C’
B
B’ D
D’
simone.bordet@gmail.com 37
ZGC
● Relocation
E F MetaData
E’ F’
B -> B’
C -> C’
A
D -> D’
C
E -> E’
F -> F’
C’
B
B’ D
D’
simone.bordet@gmail.com 38
ZGC
● Remapping
E’ F’
C’
B’
D’
simone.bordet@gmail.com 39
ZGC
● References
○ Per Lidén, Erik Österlund et al.
■ https://www.youtube.com/watch?v=7cWiwu7kYkE
■ https://www.youtube.com/watch?v=kF_r3GE3zOo
○ Project Wiki
■ https://wiki.openjdk.java.net/display/zgc/Main
○ Mailing List
■ zgc-dev@openjdk.java.net
simone.bordet@gmail.com 40
ShenandoahGC
41
ShenandoahGC
● Present in OpenJDK 12+ repository
○ Available in AdoptOpenJDK builds
○ NOT available in Oracle’s OpenJDK builds
○ Present in RedHat OpenJDK 8, 11+
● Region Based
○ Derived from G1
simone.bordet@gmail.com 43
ShenandoahGC GC Thread
App Thread
STW
Mark Start
simone.bordet@gmail.com 44
ShenandoahGC GC Thread
App Thread
Concurrent
Marking
simone.bordet@gmail.com 45
ShenandoahGC GC Thread
App Thread
STW
Mark End
simone.bordet@gmail.com 46
ShenandoahGC GC Thread
App Thread
Concurrent
Evacuation
Evacuate Objects
(Compact Heap)
simone.bordet@gmail.com 47
ShenandoahGC GC Thread
App Thread
Concurrent
Update References
Remapping pointers
(Happens During Next Mark)
simone.bordet@gmail.com 48
ShenandoahGC
● ShenandoahGC solution
○ To avoid races with the application
simone.bordet@gmail.com 49
ShenandoahGC
● HotSpot Object Header
○ "Word" == 32 bits on i386; 64 bits on x86-64
simone.bordet@gmail.com 50
ShenandoahGC 1.0
● ShenandoahGC 1.0
Mark Mark
Class Class
Field1 Field1
Field2 Field2
simone.bordet@gmail.com 51
ShenandoahGC 1.0
● ShenandoahGC 1.0
simone.bordet@gmail.com 52
ShenandoahGC 1.0
● ShenandoahGC 1.0
simone.bordet@gmail.com 53
ShenandoahGC 1.0
● Load GC barrier: dereference forward pointer
Object f = obj.field;
<load_barrier>
simone.bordet@gmail.com 54
ShenandoahGC
● Load GC barrier: dereference forward pointer
Object f = obj.field;
f = deref(addr_of(f) - 8);
simone.bordet@gmail.com 55
ShenandoahGC 1.0
● Load GC barrier: dereference forward pointer
Object f = obj.field;
<load_barrier>
simone.bordet@gmail.com 56
ShenandoahGC
● Store GC barrier
○ Runs some action depending on GC phase
obj.f = o;
<store_barrier>
simone.bordet@gmail.com 57
ShenandoahGC
● Store GC barrier
○ Runs some action depending on GC phase
obj.f = o;
if (in_evac_phase &&
in_collection_set(obj) &&
!is_forwarded(obj))
slow_path();
simone.bordet@gmail.com 58
ShenandoahGC
● Store GC barrier
○ Runs some action depending on GC phase
obj.f = o;
mov 0x3d8(%r15), %r11
test %r11, %r11
...
jne <slow_path>
simone.bordet@gmail.com 59
ShenandoahGC
● ShenandoahGC 1.0 Problems
simone.bordet@gmail.com 60
ShenandoahGC
● ShenandoahGC 2.0
Mark Mark
Class Class
Field1 Field1
Field2 Field2
simone.bordet@gmail.com 61
ShenandoahGC
● ShenandoahGC 2.0
simone.bordet@gmail.com 62
ShenandoahGC
● ShenandoahGC 2.0
simone.bordet@gmail.com 63
ShenandoahGC 2.0
● Load Barrier (LRB - Load Reference Barrier)
○ Checks whether there may be forwarded objects
■ And whether in c-set and whether is forwarded
Object f = obj.f;
<load_barrier>
simone.bordet@gmail.com 64
ShenandoahGC 2.0
● Load Barrier (LRB - Load Reference Barrier)
Object f = obj.f;
if (in_evac_phase &&
in_collection_set(obj) &&
!is_forwarded(obj))
slow_path();
simone.bordet@gmail.com 65
ShenandoahGC 2.0
● Load Barrier (LRB - Load Reference Barrier)
Object f = obj.f;
test $0x1,0x20(%r15)
...
jne <slow_path>
simone.bordet@gmail.com 66
ShenandoahGC 2.0
● Shenandoah 2.0
simone.bordet@gmail.com 67
ShenandoahGC
● Evacuation
Mark
Class
Field1
Field2
simone.bordet@gmail.com 68
ShenandoahGC
● Evacuation (GC Copy)
From Space To Space
Mark
Mark
Class
Class
Field1
Field1
Field2
Field2
simone.bordet@gmail.com 69
ShenandoahGC
● Evacuation (Application triggers LRB)
From Space To Space
Mark
Class
Field1
Mark
Mark Field2
Class
Class
Field1
Field1
Field2
Field2
simone.bordet@gmail.com 70
ShenandoahGC
● Evacuation (Atomic Fwd Ptr Update)
From Space To Space
Mark
Class
Field1
Mark
Mark Field2
Class
Class
Field1
Field1
Field2
Field2
simone.bordet@gmail.com 71
ShenandoahGC
● Evacuation (Application Wins)
From Space To Space
Mark
Class
Field1
Fwd Ptr
Mark Field2
Class
Class
Field1
Field1
Field2
Field2
simone.bordet@gmail.com 72
ShenandoahGC
● Evacuation (Application Read/Write)
From Space To Space
Mark
Class
Field1
Fwd Ptr
Field2
Class
Field1
Field2
simone.bordet@gmail.com 73
ShenandoahGC
● Update References
From Space To Space
Mark
Class
Field1
Fwd Ptr
Field2
Class
Field1
Field2
simone.bordet@gmail.com 74
ShenandoahGC
● Shenandoah Heuristics
○ Adaptive (default)
■ Maintains free heap amount
○ Static
■ Starts GC when tripping thresholds
○ Compact
■ Small footprint
○ Aggressive
■ Back to back GCs
○ Passive
■ Non concurrent, only Full GCs
○ Traversal
simone.bordet@gmail.com 75
ShenandoahGC
● References
○ Project Wiki
■ https://wiki.openjdk.java.net/display/shenandoah/Main
○ Aleksey Shipilëv, Roman Kennke et al.
■ https://www.youtube.com/watch?v=VCeHkcwfF9Q
■ https://www.youtube.com/watch?v=E1M3hNlhQCg
○ Mailing List
■ shenandoah-dev@openjdk.java.net
simone.bordet@gmail.com 76
Shenandoah
Questions?
77
Conclusions
78
Conclusions
● Give Concurrent GCs a go