mark and sweep algorithm