verbos verb triptico tables instant ingles .net winforms gdi

.net - verb - Cómo depurar fugas de objetos GDI?



instant verb tables download (4)

Obtenga una copia de Memory Profiler de Red Gate. http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

No estoy muy seguro de cómo hacerlo. Es una aplicación grande, y estamos teniendo "fugas" de objetos GDI en la mayoría de nuestros formularios.

¿Hay alguna herramienta para ayudar? ¿Hay algún tutorial sobre cómo usar dicha herramienta?

¿Debería comenzar a borrar el código de nuestros formularios hasta que reduzca al delincuente? (hay MUCHO código).


Puede usar perfmon (windows-> start-> perfmon) para monitorear la fuga de GDI. Esto tiene la capacidad de monitorear y registrar los datos en un archivo csv.


Es bastante raro exceder el límite de 10,000 objetos para objetos GDI solamente, el recolector de basura se encargará de ellos cuando no llame a su método Dispose () usted mismo. Un modo de falla mucho más probable está excediendo el límite del objeto para Windows. Lo cual es muy fácil de hacer en Winforms, Controls.Clear () o Controls.Remove () lo llevarán allí con prisa cuando no disponga explícitamente de los controles eliminados. El recolector de basura no puede limpiarlos.

Puede obtener un buen diagnóstico de Taskmgr.exe, pestaña Procesos. Ver + Seleccionar columnas y marcar Controles, Objetos USUARIO y Objetos GDI. Observe estos números para su proceso mientras lo usa. Un número cada vez mayor de uno de ellos es una señal segura de que Windows hará que su programa se caiga cuando se niegue a darle más. La cuota predeterminada es 10000 para cada uno. Objetos del USUARIO es el que indica que tiene un problema con los Controles. Borrar / Eliminar, Objetos GDI es el que indica que tiene una fuga de objetos del Sistema. Perfmon.exe es una buena herramienta para ver si el recolector de elementos no utilizados se está ejecutando con la frecuencia suficiente para liberar objetos System.Drawing liberados.

Con la sabiduría común de que llamar a Dispose () explícitamente donde se requiera es una buena práctica. Especialmente para objetos de imagen y mapa de bits, toman muy poca memoria de GC pero mucha memoria no administrada, bastante fácil de bombardear un programa con OOM cuando no los desecha. Tenga cuidado con la desagradable trampa en Properties.Resources, obtiene un nuevo objeto cada vez que lo usa y necesita ser eliminado. Utilice siempre la instrucción using en el código de pintura.


Resulta que acabo de utilizar el Administrador de tareas e intenté reproducir el problema. Nuestro problema con nuestra aplicación (y la fuga de objetos GDI) era que estábamos usando un objeto estático y vinculante para él. Hubo / hay un error con .net 3.5 (atleast) donde el formulario al cerrar no sabrá cómo deshacerse de todo correctamente y cierto objeto gráfico permanecerá en la memoria.