Incremento de memoria

23/06/2006 - 00:32 por koldo | Informe spam
Estoy creando una aplicacion en windows forms y .NET 2.0
Se hace acceso a bases de datos y se utiliza Crystal Reports para
imprimir informes.

Cada vez que abro y cierro una ventana, observo en el Administrador de
tareas el uso de memoria, y cómo esta se va incrementando.

Cuando mas se incrementa es al abrir un informe con el Crystal.

He leido sobre el uso de Dispose pero no suele ser recomendable su uso
explicito ya que hay que esperar a que el Garbage Collector libere la
memoria. No sé si esto es así exactamente.

Tampoco tengo claro si cada vez que cierre una ventana formulario,
debo de utilizar un destructor para cada objeto creado que forme parte
del formulario que voy a cerrar.

¿Existe algun tipo de solucion a esta situacion?
¿Cuál es vuestra experiencia?

Gracias y salu2

Preguntas similare

Leer las respuestas

#1 Saul Muñoz (DsK)
23/06/2006 - 02:18 | Informe spam
Que tal Koldo, en lo personal cuando es muy crítico el aspecto de la memoria
utilizo la siguiente API ojo, revisa todo lo que hace para que veas si te es
util para tus necesidades en cuanto al crystal reports, intenta destruir
cualquier referencia hacia tu reporte, para ver si disminuye el uso de
memoria si no intenta esta API y ve que no te genere ningun conflicto.

namespace GEFA.Gentour.Business {
using System.Diagnostics;


public class clsMemoryManagement {

[DllImport("kernel32.dll", EntryPoint="SetProcessWorkingSetSize")]
static extern int SetProcessWorkingSetSize(IntPtr hProcess, int
dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

public static void SwapOutProcess() {
GC.Collect();
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1,
-1);
}
}
}

y ya sólo la instancio como
clsMemoryManagement.SwapOutProcess();

Saludos
"koldo" escribió:

Estoy creando una aplicacion en windows forms y .NET 2.0
Se hace acceso a bases de datos y se utiliza Crystal Reports para
imprimir informes.

Cada vez que abro y cierro una ventana, observo en el Administrador de
tareas el uso de memoria, y cómo esta se va incrementando.

Cuando mas se incrementa es al abrir un informe con el Crystal.

He leido sobre el uso de Dispose pero no suele ser recomendable su uso
explicito ya que hay que esperar a que el Garbage Collector libere la
memoria. No sé si esto es así exactamente.

Tampoco tengo claro si cada vez que cierre una ventana formulario,
debo de utilizar un destructor para cada objeto creado que forme parte
del formulario que voy a cerrar.

¿Existe algun tipo de solucion a esta situacion?
¿Cuál es vuestra experiencia?

Gracias y salu2


Respuesta Responder a este mensaje
#2 koldo
23/06/2006 - 19:23 | Informe spam
Hola DsK Saul Muñoz

Gracias por el codigo. De momento no lo he podido probar porque ando un
poco liado.

En cuanto lo pruebe te comento cómo me ha ido.

Gracias y salu2
Respuesta Responder a este mensaje
#3 Daniel A. Calvin
23/06/2006 - 22:14 | Informe spam
Hola Koldo

Si bien es cierto lo que decis de invocar en forma explicita al GC tenes
otra opción.

Esto es válido solo si la clase en cuestion implementa IDisposable

Ej.: Clase miClase que implementa IDisposable

en vez de hacer:
miClase x=new miClase();

Debes hacer

Using miClase x=new miClase()
{
// Micodigo que utiliza la instancia xx
//
//

} // Al llegar aqui x sale de ambito y se dispara el dispose de la clase
involucrada.

Saludos

Daniel Calvin


Daniel A. Calvin
MCP


"koldo" escribió:

Estoy creando una aplicacion en windows forms y .NET 2.0
Se hace acceso a bases de datos y se utiliza Crystal Reports para
imprimir informes.

Cada vez que abro y cierro una ventana, observo en el Administrador de
tareas el uso de memoria, y cómo esta se va incrementando.

Cuando mas se incrementa es al abrir un informe con el Crystal.

He leido sobre el uso de Dispose pero no suele ser recomendable su uso
explicito ya que hay que esperar a que el Garbage Collector libere la
memoria. No sé si esto es así exactamente.

Tampoco tengo claro si cada vez que cierre una ventana formulario,
debo de utilizar un destructor para cada objeto creado que forme parte
del formulario que voy a cerrar.

¿Existe algun tipo de solucion a esta situacion?
¿Cuál es vuestra experiencia?

Gracias y salu2


Respuesta Responder a este mensaje
#4 koldo
25/06/2006 - 14:03 | Informe spam
Hola DsK Saul Muñoz y Daniel A. Calvin
He estado probando vuestras propuestas pero no consigo reducir el uso
de memoria aunque al final lo he conseguido de otra manera que comento
al final.

Tal vez sea que no estoy implementado correctamente la interface
IDisposable.

He estado leyendo y probando otros ejemplos de codigo y entiendo cómo
se debe de emplear pero con mis formularios no veo que funcione.

Yo estoy utilizando una ventana principal como menu principal y desde
esta ventana voy abriendo la ventana que me interese.
Reconozco que no estoy utilizando MDI. Tal vez sería la solucion
correcta haber empezado asi.

Como dije en el mensaje inicial, voy comprobando el uso de memoria
desde el Administrador de tareas. Si cierro una ventana incluso se
incrementa el uso de memoria. Y abrir un formulario con un informe de
Crystal Reports llega a incrementar el uso de memoria hasta en 30 megas
la primera vez. Cada ventana suele llevar 1 o 2 datagridview. ¿os
suele pasar a vosotros tambien este incremento de memoria?.

SOLUCION

El caso es que he visto una solución cuando una de las ventanas que
tenia abiertas la he minimizado. En ese momento comprobé que el uso de
memoria descendia considerablemente.

Por lo tanto decidí utilizar las siguientes instrucciones al cerrar
una ventana para conseguir reducir el uso de memoria:

this.WindowState = FormWindowState.Minimized;
this.Close();

Cada vez que cierro una ventana se ejecuta esto y el uso de memoria se
reduce.
No sé si técnicamente es adecuada esta solución aunque sí es
evidente que me resuelve el problema.

Como ya he dicho, reconozco que no utilizo MDI y que es recomendable el
uso de "using" como me decia Daniel y otros auntores que he leido. Pero
sin utilizar esto he encontrado la otra solucion. ¿Qué os parece?

Gracias y salu2
Respuesta Responder a este mensaje
#5 Daniel A. Calvin
26/06/2006 - 18:14 | Informe spam
Hola Koldo

Mas que interesante como lo resolviste.
La reducción de consumo de memoria mientras un form esta minimizado lo vas a
observar en todas las aplicaciones.
Jamás se me hubiera ocurrido hacer lo hiciste, minimizar y luego cerrar, muy
buena idea.
( aunque no se cual será la lógica )

Por otra parte Net no siembre recolecta los objetos en memoria aunque no
esten refrenciados, dependiendo del tamaño del objeto puede no liberear los
recursos.

Hay algún paper que explica bastante bien esto, voy a ver si lo encuentro te
lo mando.

En cuanto al uso del using tal vez no sea el formulario el que deba ser
instamciado mediante el using y por ello no hay cambios en el resultado.

Este tipo de problema nunca es fácil de resolver y menos a la distancia sin
poder ver un poco de código, contadores y otras cositas.

Me alegro que lo hayas solucionado de alguna manera.

Saludos

Daniel Calvin


Daniel A. Calvin
MCP


"koldo" escribió:

Hola DsK Saul Muñoz y Daniel A. Calvin
He estado probando vuestras propuestas pero no consigo reducir el uso
de memoria aunque al final lo he conseguido de otra manera que comento
al final.

Tal vez sea que no estoy implementado correctamente la interface
IDisposable.

He estado leyendo y probando otros ejemplos de codigo y entiendo cómo
se debe de emplear pero con mis formularios no veo que funcione.

Yo estoy utilizando una ventana principal como menu principal y desde
esta ventana voy abriendo la ventana que me interese.
Reconozco que no estoy utilizando MDI. Tal vez sería la solucion
correcta haber empezado asi.

Como dije en el mensaje inicial, voy comprobando el uso de memoria
desde el Administrador de tareas. Si cierro una ventana incluso se
incrementa el uso de memoria. Y abrir un formulario con un informe de
Crystal Reports llega a incrementar el uso de memoria hasta en 30 megas
la primera vez. Cada ventana suele llevar 1 o 2 datagridview. ¿os
suele pasar a vosotros tambien este incremento de memoria?.

SOLUCION

El caso es que he visto una solución cuando una de las ventanas que
tenia abiertas la he minimizado. En ese momento comprobé que el uso de
memoria descendia considerablemente.

Por lo tanto decidí utilizar las siguientes instrucciones al cerrar
una ventana para conseguir reducir el uso de memoria:

this.WindowState = FormWindowState.Minimized;
this.Close();

Cada vez que cierro una ventana se ejecuta esto y el uso de memoria se
reduce.
No sé si técnicamente es adecuada esta solución aunque sí es
evidente que me resuelve el problema.

Como ya he dicho, reconozco que no utilizo MDI y que es recomendable el
uso de "using" como me decia Daniel y otros auntores que he leido. Pero
sin utilizar esto he encontrado la otra solucion. ¿Qué os parece?

Gracias y salu2


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida