El comportamiento del GC es
no determinístico (obviamente influyen factores como los que mencionas), el hecho de que hagas "Obj = Nothing" no indica que ese momento el GC entre en funcionamiento y haga la "limpieza" de los objetos que ya no tienen referencias, estos permanecerán en el heap hasta que el GC entre en funcionamiento, puedes forzarlo con GC.Collect, no es muy usual hacer eso:
comentarios al respecto y esto es lo que dice el libro del que comento más abajo.
Cita: Avoid Calling GC.Collect
The default GC.Collect method causes a full collection of all generations. Full collections are expensive because literally every live object in the system must be visited to ensure complete collection. Needless to say, exhaustively visiting all live objects could, and usually does, take a significant amount of time. The garbage collector's algorithm is tuned so that it does full collections only when it is likely to be worth the expense of doing so. As a result, do not call GC.Collect directly — let the garbage collector determine when it needs to run.
The garbage collector is designed to be self-tuning and it adjusts its operation to meet the needs of your application based on memory pressure. Programmatically forcing collection can hinder tuning and operation of the garbage collector.
Por otro lado, ten en cuenta que el GC
no actúa sobre objetos
no manejados (acceso a ficheros, acceso a recursos de red, conexiones a base de datos, etc), en ese caso tienes que liberar los recursos manualmente.
Puedes ver el funcionamiento del GC en una animación, descargas el archivo "Día 06 y 07", dentro del archivo compreso hay otro con el nombre "GarbageCollect.zip".
http://www.buayacorp.com/vb.net/
Viendo que te preocupa lo del rendimiento de tus aplicaciones, te recomiendo la lectura del siguiente libro (disponible gratuitamente en formato pdf):
http://msdn.microsoft.com/library/de...l/scalenet.asp