markFromRoots():
initialise(work_list)
for each fld in Roots:
ref <- *fld
if ref != null and not isMarked(ref):
setMarked(ref)
add(work_list, ref)
mark()
initialise(work_list):
work_list <- empty
mark():
while not isEmpty(work_list):
ref <- remove(work_list)
for each fld in Pointers(ref):
child <- *fld
if child != null and not isMarked(child):
setMarked(child)
add(work_list, child)
Mark-Sweep: Sweep
1
2
3
4
5
6
7
8
sweep(start, end):
scan <- start
while scan < end:
if isMarked(scan):
unsetMarked(scan)
else:
free(scan)
scan <- nextObject(scan)
4 Bitmap marking
可以应用于保守式回收器(conservative collector)。
减少回收过程中的换页次数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mark():
cur <- nextInBitmap()
while cur < HeapEnd:
add(work_list, cur)
markStep(cur)
cur <- nextBitmap()
markStep(start):
while not isEmpty(work_list):
ref <- remove(work_list)
for each fld in Pointers(ref):
child <- *fld
if child != null and not isMarked(child):
setMarked(child)
if child < start:
add(work_list, child)
atomic collect():
markFromRoots()
for each block in Blocks:
if not isMarked(block):
add(blockAllocator, block)
else:
add(reclaimList, block)
atomic allocate(sz):
result <- remove(sz)
if result == null:
lazySweep(sz)
result <- remove(sz)
return result
lazySweep(sz):
repeat
block <- nextBlock(reclainmList, sz)
if block != null:
sweep(start(block), end(block))
if spaceFound(block):
return
until block == null
allocSlow(sz)
allocSlow(sz):
block <- allocateBlock()
if block != null:
initialise(block, sz)
mark():
while not isEmpty(work_list):
obj <- remove(work_list)
if not isMarked(obj):
setMarked(obj)
for each fld in Pointers(obj):
child <- *fld
if child != null:
add(work_list, child)