Mark-Sweep is a classic GC algorithm, it's combined with two parts, mark and sweep.
mark(root):
if not marked?(root):
mark(root)
for obj in knowns(root):
mark(obj)
sweep(heap):
for obj in heap:
if marked?(obj):
unmark(obj)
else:
release(obj)
If we run collection (mark-sweep), then since each object is reachable from root, so no one would be released.
After do some executions, obj1 don't need obj3 anymore, so it became:
Now when we run collection, obj3 is unreachable from root, so it won't be marked! When running to sweep, it will be dropped.