Comprimir proceso en la RAM

Iniciado por z3nth10n, 24 Julio 2013, 17:35 PM

0 Miembros y 1 Visitante están viendo este tema.

kub0x

@El Benjo: Lo que comentas no es nada más ni nada menos que la reutilización de variables. La misma variable va tomando distintos valores, en este caso objetos, por cada iteracción del bucle For.

Otra opción sería la de liberar el contenido de las variables de la siguiente manera:

Código (VB.NET) [Seleccionar]

...
                   oUser = Nothing
                   pUser = Nothing
...
     


De esta forma le estás indicando al GC que libere el contenido de dicha variable. GC = Garbage Collector.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


El Benjo

Pero cada cuanto tiempo se libera la memoria del GC, porque hay que recordar que el GC no limpia la memoria cada que hacemos "Variable = Nothing".

Según sé, lo hace apróximadamente cada tres segundos. Imagínate que continúa con su código como está y simplemente hace

Código (vbnet) [Seleccionar]

oUser = Nothing
pUser = Nothing


y lo hace tan rápido que supera al GC. Pues va pasar que por un momento, aunque sea breve, va seguir ocupando los mismos 900 Mb de memoria. Ahora eso se resuelve forzando al GC a que limpie la memoria después de cada "Variable = Nothing", pero el código se vuelve lento y no es recomendable. Por eso que sugería la reutilización de variables.

Ikillnukes, intenta las tres formas y nos dices con cuál te fue mejor. Saludos.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

kub0x

@ElBenjo: Exacto, no es una práctica recomendable setear las variables a Nothing. Particularmente prefiero la reutilización de variables o la implementación de IDisposable dentro del Objeto para después llamar a Dispose(). Como dije anteriormente el GC resta velocidad a la aplicación y por lo tanto eficiencia.

Estaría bien que Ikillnukes provase todas las opciones aquí mencionadas.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


raul338

Invoca al garbage collector a mano
Código (vb,7) [Seleccionar]
Dim a As Object
A =  New ....

.......
A.Dispose() ' siempre que se pueda
A = Nothing
GC.Collect()


Sent from my LG-E612g

kub0x

@raul338: Llamar al Garbage Collector se considera mala práctica, pues es el mismo quien se invoca automáticamente para liberar los recursos no utilizados tales como variables no utilizadas o sin referenciar (var = nothing). Si el Objeto implementa IDisposable, es decir, tiene por método Dispose(), pues has de llamarlo ya que es el destructor del objeto. Si hicieras ->
Código (Vb.NET) [Seleccionar]
Obj = Nothing lo que estás haciendo es quitar la referencia al objeto, pero no lo estás liberando, sigue en memoria, lo único que el Garbage Collector lo suprimirá cuando sea invocado, pero llamarlo en cada iteracción (como el ejemplo de Ikillnukes) sería una locura.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate