Como o próprio Java gerencia a memória através de seu próprio coletor de lixo, teremos que simular um cenário simplificado, onde rastreamos explicitamente objetos root em uma pequena estrutura personalizada.Quando você está rolando seu próprio sistema de gerenciamento de memória personalizado, definitivamente precisa projetar o aplicativo para funcionar nesse modelo de memória.Para continuar com o nosso exemplo simplificado de um sistema de gerenciamento de memória personalizado em Java, vamos expandir a implementação para incluir um algoritmo de varredura.Ao criar um script de alocação de memória personalizado, você precisa lembrar que ele é responsável por reservar a memória para novos objetos.Durante a coleta de lixo, os objetos vivos são copiados para a outra metade e, em seguida, os papéis das metades são trocados.
Fonte: https://coderoasis.com/custom-java-garbage-collector/