2009-05-15 17 views
11

Estoy intentando rastrear un problema en nuestro código MFC que parece un problema de limitación de recursos. La memoria y la CPU se ven bien. De acuerdo con la pestaña de procesos en el Administrador de tareas nuestros objetos GDI se alinean con otras aplicaciones, pero nuestros objetos USER parecen ser un factor de 10 veces más que otras aplicaciones.¿Qué son los "objetos USER" de Windows?

¿Qué es un "objeto de USUARIO" y cuáles son los límites?

Respuesta

12

Aquí es un artículo de "clásico" de MSDN: Give Me a Handle, and I'll Show You an Object

La última vez que estaba rastreando fugas de objetos de Windows (que sospecho que tiene) Process Explorer fue útil (¿handley?). El panel inferior podría mostrar algunos objetos asignados del sistema, además de que podría hacer el simple recuento de objetos USER, GDI, etc.

desktop heap, que es un grupo de memoria en el que el "objeto" real que representa el identificador se almacena (al menos algunos identificadores, al menos no el núcleo). A veces no es tanto la cantidad de identificadores asignados, sino la cantidad de memoria que usa cada objeto con ese identificador. Puede depurar el montón this way. Es un pain para instalar.

11

Leer todo sobre ella here:

categorías de objetos

El sistema ofrece tres categorías de objetos: el usuario, la interfaz de dispositivo gráfico (GDI), y de almendra. El sistema utiliza objetos de usuario para admitir la gestión de ventanas, objetos GDI para admitir gráficos y objetos kernel para admitir la gestión de memoria, la ejecución de procesos y las comunicaciones entre procesos (IPC). Para obtener información sobre cómo crear y usar un objeto específico, consulte la descripción general asociada.

usuario Objetos

objetos de interfaz de usuario admiten sólo un mango por objeto. Los procesos no pueden heredar o duplicar identificadores a objetos de usuario. Los procesos en una sesión no pueden hacer referencia a un manejador de usuario en otra sesión.

Existe un límite teórico de 65.536 identificadores de usuario por sesión. Sin embargo, la cantidad máxima de identificadores de usuario que se pueden abrir por sesión suele ser menor, ya que se ve afectada por la memoria disponible. También hay un límite predeterminado por proceso de identificadores de usuario. Para cambiar este límite, establecer el valor del Registro siguiente:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota

Este valor se puede ajustar a un número entre 200 y 18.000.

1

No sé lo que que son, pero sí sé que incluyen identificadores de ventana.

Para ventana maneja hay un sistema de ancho máximo de aproximadamente 32.000, y un máximo por proceso de 10000. (Este límite sólo puede ser objeto usuario, en lugar de sólo identificadores de ventana.)

El número de identificadores de ventana puede ser muy alta si tiene fugas en los identificadores de ventanas o si usa grandes cantidades de ventanas. (Tenga en cuenta que los controles más simples como una etiqueta de texto consume un único identificador de ventana.)

+1

¿Alguna referencia de Microsoft al límite 32000? –

+0

Encontré el límite de 10000 para un proceso.Una vez que se alcanza el límite, recibirá 'error al crear el identificador de ventana' al intentar crear un nuevo objeto de winforms. –

Cuestiones relacionadas