Teoricamente todo ese proceso es realizado automaticamente por el garbage collector, que corre simultaneamente con tu programa en un thread separado, viendo si existe la posibilidad de liberar memoria (cuando por ejemplo ya no hay referencias a un objeto). A diferencia de C++, no hay metodos como 'delete', que vendria a ser el opuesto de 'new' que se usa para crear el objeto.
El problema esta en que el garbage collector no actua de forma instantanea, por lo que tu aplicacion podria estar acumulando varios objetos ya muertos en memoria que podrian ser eliminados pero no lo son. Para este caso, se puede utilizar el System.gc(), que es una forma de sugerir que ahora seria un buen momento para empezar a ver si se puede limpiar memoria. Se debe elegir un momento especifico para llamar a este metodo debido a que tiende a generar pausas en la aplicacion, al borrar grandes cantidades de metodos no utilizados...por ejemplo, lo podes llamar mientras esperas el input de un usuario o en otras partes de la aplicacion donde no se este realizando varios procesos simultaneos.