Animation of the Lisp2 GC
(CGO Chapter 10)
STEP 1
mark(addr): recursively mark all arrays that are reachable from the array beginning at address addr.
mark(1)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(1)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(1)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(1)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(7)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(7)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(11)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(11)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(11)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(11), done!
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
Resume mark(7) after recursive call completes
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(7)
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(11), already visited
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(7), done!
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
mark(1), done!
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
STEP 2
computeAddresses(): for each visited array, compute a new address for the array in the compacted heap.
computeAddresses()
10 7
1: 2: 3:
2 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 1
Set forwarding address
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 1
new ← new + 3
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 4
Advance scan pointer
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 4
Advance scan pointer
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 4
Set forwarding address
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 4
new ← new + 4
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 8
Advance scan pointer
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 62
12: 13: 11:
0
Heap
scan
new = 8
Set forwarding address
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
new = 8
new ← new + 3
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
new = 11
STEP 3
updatePointers(): update pointers to point to the forwarding addresses.
updatePointers()
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 7
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 11
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 11 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
STEP 4
relocate(): relocate each array to its forwarding addresses.
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 1 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
relocate to address 1
updatePointers()
10 4
1: 2: 3:
2 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 2
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
relocate to address 4
updatePointers()
10 4
1: 2: 3:
2 3
4:
31 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 7
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6:
3 4 8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6:
8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
8
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6:
8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
8
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6:
8
8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
8
relocate to address 8
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6: 8: 7: 9: 10:
40 8 2 8 62
12: 13: 11:
0
Heap
scan
8 2
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6: 8: 7: 9: 10:
62 8 2 8 62
12: 13: 11:
0
Heap
scan
8 2
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6: 8: 7: 9: 10:
62 0 2 8 62
12: 13: 11:
0
Heap
scan
8 2
updatePointers()
10 4
1: 2: 3:
2 3
4:
8 40
5: 6: 8: 7: 9: 10:
62 0
Heap
8 2