Documentation is very scarce about engine internals

Thanks for your explanations.

So if I declare 2 UObject subclasses with refereances to each other, one of them should be TWeakPtr
What if I create 2 blueprint class, which have references to each other ? I couldn’t find a way to declare variables in blueprint to be “Weak”

Now about the “root”. Typically GC scans object references from some "root"s, like static variables in classes, variables in thread-stack, it’s a recursive process until all reachable objects are scanned, all remaining unscanned objects are garbage.
What I see in UE4 is, UE4 allocate all objects into a big array, some objects might be flagged as “root”, when UE4 try to collect garbage, it scans the whole array, not only “root” objects in this array. Do so means, it will scan into unreachable objects, it’s a wasting of CPU cycles, also bring trouble to handle cyclic references.