Download as pdf or txt
Download as pdf or txt
You are on page 1of 79

Concurrent GCs

ZGC & Shenandoah


@simonebordet

sbordet@webtide.com
Simone Bordet
● @simonebordet
● sbordet@webtide.com

● Works @ Webtide
○ The company behind Jetty and CometD

● JVM Tuning Expert

simone.bordet@gmail.com 2
Introduction

3
Introduction Stop-The-World

Concurrent

Young Generation Old Generation

Parallel Copy Mark Compact

simone.bordet@gmail.com 4
Introduction Stop-The-World

Concurrent

Young Generation Old Generation

Parallel Copy Mark Compact

CMS Copy Conc Mark Conc Sweep

simone.bordet@gmail.com 5
Introduction Stop-The-World

Concurrent

Young Generation Old Generation

Parallel Copy Mark Compact

CMS Copy Conc Mark Conc Sweep

G1 Copy Conc Mark Compact

simone.bordet@gmail.com 6
Introduction Stop-The-World

Concurrent

Young Generation Old Generation

Parallel Copy Mark Compact

CMS Copy Conc Mark Conc Sweep

G1 Copy Conc Mark Compact

ZGC Conc Mark Conc Compact

Shenandoah Conc Mark Conc Compact

simone.bordet@gmail.com 7
Introduction
● Concurrent GCs
○ GC runs concurrently with the application

● GC races with Application


○ Marking an object “alive”
○ Compacting / Moving objects

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

Region Region Region

Header Header

f a=1

Header

a=1

"From Space" "To Space"

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

● Concurrent GCs require JIT support

● JIT injects code that helps the GC


○ GC barriers

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

● Scalable Low Latency GC

● Concurrent Compaction, Single Generation


simone.bordet@gmail.com 16
ZGC
● Only for Linux x86 64-bit
○ No compressed pointers
○ ARM port underway

● 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

Scan threads stacks


Mark object roots

simone.bordet@gmail.com 18
ZGC GC Thread
App Thread

Concurrent
Marking

Mark object graph


Gather liveness information

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

Weak Reference Processing


Free Memory Pages
Unload Classes
Prepare Relocation Set

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

64 bits pointer address

● Check pointer color against GC phase


○ Wrong color => take action

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>

mov 0x10(%rdi), %rsi


test %rsi, 0x20(%r15)
jne slow_path
simone.bordet@gmail.com 29
ZGC
● ZGC load GC barrier tests for the right color

● Wrong color -> take slow_path


○ Fix color & Run some action - atomically

● The action depends on the GC phase

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

● RSS shows 3x size


○ E.g. -Xmx=16G -> RSS~=50G
○ On Linux, use smem and track PSS

● Watch out for OOM Killers in clouds


○ E.g. AWS
simone.bordet@gmail.com 32
ZGC
● Relocation
E F

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+

● Scalable low latency GC

● Concurrent Compaction, Single Generation


simone.bordet@gmail.com 42
ShenandoahGC
● Available for x86 32-bit and 64-bit
○ ARM ports available

● Linux, MacOS, Windows


○ JDK 8, 11 & Latest

● Region Based
○ Derived from G1
simone.bordet@gmail.com 43
ShenandoahGC GC Thread
App Thread

STW
Mark Start

Scan threads stacks


Mark object roots

simone.bordet@gmail.com 44
ShenandoahGC GC Thread
App Thread

Concurrent
Marking

Mark object graph


Gather liveness information

simone.bordet@gmail.com 45
ShenandoahGC GC Thread
App Thread

STW
Mark End

Weak Reference Processing


Unload Classes
Evacuate Roots
Housekeeping

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

● Brooks (Forward) Pointers

● Load & Store GC Barriers

simone.bordet@gmail.com 49
ShenandoahGC
● HotSpot Object Header
○ "Word" == 32 bits on i386; 64 bits on x86-64

Mark Word Class Word Field 1 Field 2

Mark Word Class Word Array Length Slot 1 Slot 2

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

Fwd Ptr Fwd Ptr

Mark Mark Mark Mark

Class Class Class Class

Field1 Field1 Field1 Field1

Field2 Field2 Field2 Field2

simone.bordet@gmail.com 52
ShenandoahGC 1.0
● ShenandoahGC 1.0

● Maintains weak to-space invariant


○ Reads from both from-space to-space copies
○ Writes only to to-space copy

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>

mov 0x10(%rdi), %rsi


mov -0x08(%rsi), %rsi

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

● More memory needed (due to the forward pointer)


○ Worst case 50%, common case 5-10%

● Complicated (exotic) GC barriers


○ Load & Store GC barriers to maintain invariants

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

From Space To Space

Mark Mark Mark Fwd Ptr Mark

Class Class Class Class Class

Field1 Field1 Field1 Field1 Field1

Field2 Field2 Field2 Field2 Field2

simone.bordet@gmail.com 62
ShenandoahGC
● ShenandoahGC 2.0

● Maintains a strong to-space invariant


○ Reads only possible from to-space copy
○ Writes only possible from to-space copy

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

● Load and Store GC barrier are the same!


○ Big codebase simplification
○ Improved performance

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

● Stuck with JDK 8?


○ Use Shenandoah
Already using JDK 11+?
○ ZGC or Shenandoah

● Report your feedback!


simone.bordet@gmail.com 79

You might also like