Fragmentation is a situation where the available memory is cut up into small pieces, making it impossible to find a large piece.
A garbage collector can eliminate fragmentation by compactifying, moving the used memory together and leaving the unused memory in a single large block. But compactification can only done if relocation of pointers is also done, and that requires a way to store a table that takes an old pointer value and gives the corresponding new pointer value. The table can be stored in the memory being garbage-collected, provided the compactified memory is put into a different memory buffer.