Самая простая причина в том, что маркер может пропустить некоторые достижимые объекты, если путь к объекту изменяется.Рассмотрим следующую программу и сценарий:
a = new Object();
b = new Object();
b.c = new Object();
// gc process marks a, nothing reachable from a
a.c = b.c;
b.c = null;
// gc process marks b, nothing reachable from b
// marking phase completes, a.c is not marked
// gc sweeps a.c
print a.c; // safety violation