La única vez que he usado en el código que no era específicamente para comparar el uso de memoria de dos o más diferentes enfoques para algo tenía el siguiente escenario:
En una aplicación web (y por lo tanto, a largo -rutamiento), había algunas colecciones muy grandes que generalmente se reconstruirían unas pocas veces al día, a menudo con mucha menos frecuencia.
Varios objetos dentro de esa colección serían equivalentes, y por lo tanto se podría ahorrar mucha memoria reemplazando las referencias de un objeto por una referencia a la otra (después de compilar la colección era de solo lectura, y por lo tanto aliasing involucrado era seguro).Entonces, primero se construiría la colección, pero luego se reduciría su tamaño, matando a muchos objetos.
Esto significa que hubo un aumento repentino en la cantidad de objetos destruidos por segundo, que luego no volvería a suceder durante varias horas como mínimo. Como tal, el GC no juzgaría correctamente la cantidad de recolección necesaria, y ese recuerdo estaba a punto de ser necesario para construir la segunda gran colección. Por lo tanto, hacer una recolección manual de cada mil operaciones de limpieza tuvo un efecto positivo en el rendimiento (lo suficiente como para pasar de la falla de la aplicación a la tercera colección, a que sea confiable).
Se realizó una gran cantidad de medidas para asegurarse de que fuera beneficioso en este caso.
Los dos factores que hicieron de este beneficiosos fueron:
- Una gran cantidad de muertes de objetos que pasó.
- El evento que causa esto fue raro durante la vida de la aplicación.
Sin que ambos sean ciertos, la llamada manual sería innecesaria. Sin muchas muertes de objetos, no tiene sentido, y si no fuera raro en la vida útil de la aplicación, el GC se habría autoajustado para hacer frente.
http://stackoverflow.com/questions/478167/when-is-it-acceptable-to-call-gc-collect, http://stackoverflow.com/questions/1149197/gc-collect, http://stackoverflow.com/questions/5248838/to-gc-collect-or-not, etc ..... – Cocowalla