El garbage collector es un mecanismo que provee la Máquina Virtual para manejar la memoria de forma transparente para el desarrollador. Cuando un objeto ya no es referenciado por ningún otro, deja de ser útil porque nadie puede mandarle mensajes. Si ya no es útil, está ocupando espacio innecesariamente, con lo cual el garbage collector se encarga de liberar ese espacio sin afectar al sistema.
Al tener un garbage collector podemos evitarnos los problemas asociados al manejo manual de memoria que ocurren comunmente, por ejemplo, en lenguajes como C como liberar más de una vez la misma posición de memoria, leaks de memoria, etc. A su vez nos permite concentrarnos en los que nuestro programa debe hacer con un grado de abstracción más alto.
Hay garbage collectors con diferentes estrategias, la más utilizada es la generacional que se basa en el hecho de que los objetos con mayor propensión a no ser necesitados nuevamente son los más nuevos (por ejemplo, el resultado de un cálculo que se usa en el momento y no se necesita más), a partir de esta idea es posible optimizar el algoritmo de recolección. Resolver esta problemática a mano para cada programa no sólo desvía nuestra atención del objetivo, además que sea igualmente o más eficiente que un algoritmo genérico y ampliamente probado es muy poco probable.
Para la gente curiosa, acá hay un artículo simpático que muestra gráficamente distintos algoritmos de recolección: Visualizing Garbage Collection Algorithms