I'm investigating on integrating a gc to my llvm project, and when I read [this document](http://llvm.org/docs/Statepoints.html), one sentence confused me:

> 
> However, for a collector which wishes to relocate objects directly
>  reachable from running code, a higher standard is required.
> 
> 
> 

I don't understand what the move "relocate objects directly reachable from running code" trying to do.

For my information, the concept "relocate" means the gc pointer refereed to a new location of an object, for example:

in Java:

```
Foo foo = new Foo();

foo = new Foo(); // ---> a relocation happens

```

So can anyone explain what the "relocate objects directly reachable from running code" trying to do?

Edit:

About the concept "relocation", the document does not explain it, but I found [this document](https://github.com/dotnet/llilc/blob/master/Documentation/llilc-gc.md), it's a compiler for dotnet which is implement by llvm, it explained this concept: 

> 
> A GC algorithm is relocating if during a GC, GC pointers may be
>  updated to refer to the new location of an object. An algorithm update
>  pointers found in certain regions but not others. For instance, GC
>  pointers from the stack might not be updated while GC pointers in the
>  heap might be updatable. If the algorithm relocates pointers from all
>  regions, it is fully relocating. When a GC is relocating pointers from
>  some memory region, it necessarily implies the GC reporting is precise
>  in that region.
> 
> 
> 

I don't know if I understand "relocation" right, so I paste this for you information.