Because predicates, modules and functors (name/arity pairs) are not garbage collected. Eventually that bites Logtalk as well:
r :-
gensym(n, Name),
gensym(a, Pred),
C =.. [Pred,X],
findall(C, between(1,3,X), Cs),
create_object(Name, [], [public(Pred/1)], Cs),
findall(X, Name::C, Ns),
assertion(Ns == [1,2,3]),
abolish_object(Name).
Now run this and watch the process using OS tools to see it grow forever.
?- forall(between(1, 1000000, _), r).