Compartir a través de


Recolección de elementos no utilizados de estación de trabajo y servidor

El recolector de basura es autoajustable y puede funcionar en una amplia variedad de escenarios. Sin embargo, puede establecer el tipo de recolección de basura en función de las características de la carga de trabajo. CLR proporciona los siguientes tipos de recolección de basura:

  • Recolección de basura en estaciones de trabajo (GC), que está diseñada para aplicaciones cliente. Es el tipo de GC predeterminado para las aplicaciones independientes. En el caso de las aplicaciones hospedadas, por ejemplo, las hospedadas por ASP.NET, el host determina el tipo de GC predeterminado.

    La recolección de elementos no utilizados de estación de trabajo puede ser simultánea o no simultánea. La recolección de basura simultánea (o en segundo plano) permite que los subprocesos administrados continúen operando durante una recolección de basura. La recolección de elementos no utilizados en segundo plano reemplaza la recolección simultánea de elementos no utilizados en .NET Framework 4 y versiones posteriores.

  • Recolección de elementos no utilizados del servidor, que está pensada para las aplicaciones de servidor que necesitan un alto rendimiento y escalabilidad.

    • En .NET Core, la recolección de basura del servidor puede ser no concurrente o en segundo plano.

    • En .NET Framework 4.5 y versiones posteriores, la recolección de elementos no utilizados de servidor puede ser no simultánea o en segundo plano. En .NET Framework 4 y versiones anteriores, la recolección de elementos no utilizados del servidor no es simultánea.

En la ilustración siguiente se muestran los subprocesos dedicados que realizan la recolección de elementos no utilizados en un servidor:

Subprocesos de recolección de elementos no utilizados de servidor

Consideraciones sobre el rendimiento

Estación de trabajo de catálogo global

Estas son algunas consideraciones sobre subprocesos y rendimiento para la recolección de elementos no utilizados de estación de trabajo:

  • La recolección se produce en el subproceso del usuario que desencadenó la recolección de elementos no utilizados y permanece en la misma prioridad. Dado que los subprocesos de usuario normalmente se ejecutan con prioridad normal, el recolector de elementos no utilizados (que se ejecuta en un subproceso de prioridad normal) debe competir con otros subprocesos durante el tiempo de CPU. (Los subprocesos que ejecutan código nativo no se suspenden en la recolección de elementos no utilizados de servidor o de estación de trabajo).

  • La recolección de elementos no utilizados de estación de trabajo siempre se utiliza en un equipo que tiene una sola CPU lógica, sin tener en cuenta el valor de configuración.

Servidor de catálogo global

A continuación se indican las consideraciones de procesos y rendimiento para la recolección de basura del servidor:

  • La colección se produce en varios subprocesos dedicados. En Windows, estos subprocesos se ejecutan en el nivel de prioridad THREAD_PRIORITY_HIGHEST.

  • Para cada CPU lógica se proporciona un montón y un subproceso dedicado para realizar recolección de elementos no utilizados y, al mismo tiempo, se recolectan los montones. Cada montón contiene un montón de objetos pequeños y un montón de objetos grandes; a todos ellos se puede tener acceso mediante código de usuario. Los objetos de montones diferentes pueden hacerse referencia a entre sí.

  • Dado que varios subprocesos de recolección de elementos no utilizados funcionan juntos, la recolección de elementos no utilizados de servidor es más rápida que la de estación de trabajo, con un montón del mismo tamaño.

  • La recolección de elementos no utilizados de servidor suele tener segmentos de mayor tamaño. Sin embargo, esto es solo una generalización: el tamaño del segmento es específico de la implementación y está sujeto a cambios. No haga ninguna suposición sobre el tamaño de los segmentos asignados por el recolector de elementos no utilizados al optimizar la aplicación.

  • La recolección de elementos no utilizados del servidor puede consumir muchos recursos. Por ejemplo, imagine que hay 12 procesos que usan GC de servidor que se ejecutan en un equipo que tiene cuatro CPU lógicas. Si todos los procesos intentaran recoger basura al mismo tiempo, interferirían entre sí, ya que habría 12 hilos programados en la misma CPU lógica. Si los procesos están activos, no es recomendable que todos usen GC de servidor.

Si ejecutas cientos de instancias de una aplicación, considera usar la recolección de basura de estación de trabajo con la recolección de basura concurrente deshabilitada. Esto dará lugar a menos cambio de contexto, lo que puede mejorar el rendimiento.

Consulte también