Opciones de configuración de ejecución para la recolección de elementos no utilizados

Esta página contiene información sobre la configuración del recolector de elementos no utilizados (GC) del entorno de ejecución de .NET. Si intenta lograr el máximo rendimiento de una aplicación en ejecución, valore la posibilidad de usar esta configuración. Sin embargo, los valores predeterminados proporcionan un rendimiento óptimo para la mayoría de aplicaciones en situaciones habituales.

En esta página, la configuración se organiza en grupos. La configuración de cada grupo se usa normalmente junto con las otras para lograr un resultado concreto.

Nota

  • El entorno de ejecución lee estas configuraciones solamente cuando se inicializa la recolección de elementos no utilizados (normalmente durante el inicio del proceso). Si cambia una variable de entorno cuando un proceso ya está en ejecución, el cambio no se refleja en ese proceso. Los valores de configuración que se pueden cambiar mediante API en tiempo de ejecución, como el nivel de latencia, no se incluyen en esta página.
  • Dado que la recolección de elementos no utilizados se hace por proceso, rara vez tiene sentido establecer estos valores de configuración en el nivel de máquina. Por ejemplo, no querrá que todos los procesos de .NET de una máquina usen la recolección de elementos no utilizados del servidor ni el mismo límite máximo del montón.
  • En el caso de los valores numéricos, use la notación decimal para la configuración del archivo runtimeconfig.json o runtimeconfig.template.json y la notación hexadecimal para la configuración de las variables de entorno. Para los valores hexadecimales, puede especificarlos con o sin el prefijo "0x".
  • Si usa las variables de entorno, .NET 6 y versiones posteriores estandarizan en el prefijo DOTNET_ en lugar de COMPlus_. Sin embargo, el prefijo COMPlus_ seguirá funcionando. Si usa una versión anterior del runtime de .NET, debe seguir usando el prefijo COMPlus_, por ejemplo, COMPlus_gcServer.

Formas de especificar la configuración

Existen distintas maneras de especificar los valores de configuración para las diferentes versiones del entorno de ejecución de .NET. En la tabla siguiente se muestra un resumen.

Ubicación de configuración Versiones de .NET a las que se aplica esta ubicación Formatos Cómo se interpreta
runtimeconfig.json file/
runtimeconfig.template.json file
.NET (Core) n n se interpreta como un valor decimal.
Variable del entorno .NET Framework, .NET (Core) 0xn o n n se interpreta como un valor hexadecimal en cualquier formato.
archivo app.config .NET Framework 0xn n se interpreta como un valor hexadecimal1

1 Puede especificar un valor sin el prefijo 0x de una configuración de archivo app.config, pero no se recomienda. En .NET Framework 4.8 y versiones posteriores, debido a un error, un valor especificado sin el prefijo 0x se interpreta como hexadecimal. Sin embargo, en versiones anteriores de .NET Framework, se interpreta como decimal. Para no tener que cambiar la configuración, use el prefijo 0x al especificar un valor en el archivo app.config.

Por ejemplo, si quiere especificar 12 montones para GCHeapCount en una aplicación de .NET Framework denominada A.exe, agregue el siguiente XML al archivo A.exe.config.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    ...
    <runtime>
        <gcServer enabled="true"/>
        <GCHeapCount>0xc</GCHeapCount>
    </runtime>
</configuration>

Tanto para .NET (Core) como para .NET Framework, puede usar variables de entorno.

En Windows, con .NET 6 o versiones posteriores:

SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c

En Windows, con .NET 5 o versiones anteriores:

SET COMPlus_gcServer=1
SET COMPlus_GCHeapCount=c

En otros sistemas operativos:

Para .NET 6 o versiones posteriores:

export DOTNET_gcServer=1
export DOTNET_GCHeapCount=c

Para .NET 5 y versiones anteriores:

export COMPlus_gcServer=1
export COMPlus_GCHeapCount=c

Si no usa .NET Framework, también puede establecer el valor en el archivo runtimeconfig.json o runtimeconfig.template.json.

Archivo runtimeconfig.json:

{
  "runtimeOptions": {
   "configProperties": {
      "System.GC.Server": true,
      "System.GC.HeapCount": 12
   }
  }
}

archivo runtimeconfig.template.json:

{
  "configProperties": {
    "System.GC.Server": true,
    "System.GC.HeapCount": 12
  }
}

Tipos de recolección de elementos no utilizados

Los dos tipos principales de recolección de elementos no utilizados son la GC de estación de trabajo y la de servidor. Para más información sobre la diferencia entre estos dos tipos, consulte Recolección de elementos no utilizados de estación de trabajo y de servidor.

Los subtipos de la recolección de elementos no utilizados son en segundo plano y no simultáneos.

Use la configuración siguiente para seleccionar los tipos de la recolección de elementos no utilizados:

Estación de trabajo frente a servidor

  • Configura si la aplicación usa la recolección de elementos no utilizados de estación de trabajo o la de servidor.
  • Predeterminado: recolección de elementos no utilizados de estación de trabajo. Esto es equivalente a establecer el valor en false.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.Server false: estación de trabajo.
true: servidor.
.NET Core 1.0
Propiedad de MSBuild ServerGarbageCollection false: estación de trabajo.
true: servidor.
.NET Core 1.0
Variable del entorno COMPlus_gcServer 0: estación de trabajo.
1: servidor.
.NET Core 1.0
Variable del entorno DOTNET_gcServer 0: estación de trabajo.
1: servidor.
.NET 6
app.config para .NET Framework GCServer false: estación de trabajo.
true: servidor.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.Server": true
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.Server": true
   }
}

Archivo del proyecto:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
  </PropertyGroup>

</Project>

GC en segundo plano

  • Configura si está habilitada la recolección de elementos no utilizados en segundo plano (simultánea).
  • Predeterminado: uso de GC en segundo plano. Esto es equivalente a establecer el valor en true.
  • Para más información, consulte Recolección de elementos no utilizados en segundo plano.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.Concurrent true: GC en segundo plano.
false: GC no simultáneo.
.NET Core 1.0
Propiedad de MSBuild ConcurrentGarbageCollection true: GC en segundo plano.
false: GC no simultáneo.
.NET Core 1.0
Variable del entorno COMPlus_gcConcurrent 1: GC en segundo plano.
0: GC no simultáneo.
.NET Core 1.0
Variable del entorno DOTNET_gcConcurrent 1: GC en segundo plano.
0: GC no simultáneo.
.NET 6
app.config para .NET Framework gcConcurrent true: GC en segundo plano.
false: GC no simultáneo.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.Concurrent": false
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.Concurrent": false
   }
}

Archivo del proyecto:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
  </PropertyGroup>

</Project>

Administración del uso de recursos

Use la siguiente configuración para administrar el uso del procesador y la memoria del recolector de elementos no utilizados:

Para obtener más información sobre algunos de estos valores, vea la entrada de blog en la que se detalla el término medio entre la GC de la estación de trabajo y del servidor.

Heap count (Recuento de montones)

  • Limita el número de montones creados por el recolector de elementos no utilizados.
  • Solo se aplica a la recolección de elementos no utilizados del servidor.
  • Si la afinidad del procesador de GC está habilitada (el valor predeterminado) el valor del recuento de montones establece afinidad entre n montones o subprocesos de GC en los primeros n procesadores. (Use los valores affinitize mask o affinitize ranges para especificar exactamente los procesadores entre los que se va a establecer afinidad).
  • Si la afinidad del procesador de GC está deshabilitada, esta configuración limita el número de montones de GC.
  • Para obtener más información, vea la sección Comentarios de GCHeapCount.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapCount valor decimal .NET Core 3.0
Variable del entorno COMPlus_GCHeapCount valor hexadecimal .NET Core 3.0
Variable del entorno DOTNET_GCHeapCount valor hexadecimal .NET 6
app.config para .NET Framework GCHeapCount valor decimal .NET Framework 4.6.2

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapCount": 16
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapCount": 16
   }
}

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para limitar el número de montones a 16, los valores serían 16 para el archivo JSON y 0x10 o 10 para la variable de entorno.

Affinitize mask (Máscara de afinidad)

  • Especifica los procesadores exactos que deben usar los subprocesos del recolector de elementos no utilizados.
  • Si la afinidad del procesador de GC está deshabilitada, esta configuración se ignora.
  • Solo se aplica a la recolección de elementos no utilizados del servidor.
  • El valor es una máscara de bits que define los procesadores que están disponibles para el proceso. Por ejemplo, un valor decimal de 1023 (o un valor hexadecimal de 0x3FF o 3FF si utiliza la variable de entorno) es 0011 1111 1111 en notación binaria. Esto especifica que se usarán los 10 primeros procesadores. Para especificar los 10 procesadores siguientes, es decir, los procesadores 10-19, especifique un valor decimal de 1047552 (o un valor hexadecimal de 0xFFC00 o FFC00), que es equivalente a un valor binario de 1111 1111 1100 0000 0000.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapAffinitizeMask valor decimal .NET Core 3.0
Variable del entorno COMPlus_GCHeapAffinitizeMask valor hexadecimal .NET Core 3.0
Variable del entorno DOTNET_GCHeapAffinitizeMask valor hexadecimal .NET 6
app.config para .NET Framework GCHeapAffinitizeMask valor decimal .NET Framework 4.6.2

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapAffinitizeMask": 1023
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapAffinitizeMask": 1023
   }
}

Affinitize ranges (Intervalos de afinidad)

  • Especifica la lista de procesadores que se van a usar para los subprocesos del recolector de elementos no utilizados.
  • Este valor es similar a System.GC.HeapAffinitizeMask, salvo que permite especificar más de 64 procesadores.
  • En el caso de los sistemas operativos Windows, agregue el prefijo con el grupo de CPU correspondiente al número o el rango del procesador, por ejemplo, "0:1-10,0:12,1:50-52,1:7". Si realmente no tiene más de 1 grupo de CPU, no puede usar esta configuración. Debe usar la configuración Affinitize mask (Máscara de afinidad). Y los números que especifique están dentro de ese grupo, lo que significa que no puede ser >= 64.
  • En el caso de los sistemas operativos Linux, en los que no existe el concepto Grupo de CPU, puede usar tanto esta configuración como la de Affinitize mask para especificar los mismos rangos. Y en lugar de "0:1-10", especifique "1-10" porque no es necesario especificar un índice de grupo.
  • Si la afinidad del procesador de GC está deshabilitada, esta configuración se ignora.
  • Solo se aplica a la recolección de elementos no utilizados del servidor.
  • Para más información, consulte la publicación del blog de Maoni Stephens sobre la mejora de la configuración de la CPU para la GC en máquinas con > 64 CPU.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapAffinitizeRanges Lista separada por comas de números de procesador o rangos de números de procesador.
Ejemplo de Unix: "1-10,12,50-52,70"
Ejemplo de Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Variable del entorno COMPlus_GCHeapAffinitizeRanges Lista separada por comas de números de procesador o rangos de números de procesador.
Ejemplo de Unix: "1-10,12,50-52,70"
Ejemplo de Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Variable del entorno DOTNET_GCHeapAffinitizeRanges Lista separada por comas de números de procesador o rangos de números de procesador.
Ejemplo de Unix: "1-10,12,50-52,70"
Ejemplo de Windows: "0:1-10,0:12,1:50-52,1:7"
.NET 6

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:7"
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:7"
   }
}

Grupos de CPU

  • Configura si el recolector de elementos no utilizados usa grupos de CPU o no.

    Cuando un equipo Windows de 64 bits tiene varios grupos de CPU, es decir, hay más de 64 procesadores, la habilitación de este elemento amplía la recolección de elementos no utilizados en todos los grupos de CPU. El recolector de elementos no utilizados usa todos los núcleos para crear y equilibrar montones.

    Nota:

    Este es un concepto de solo Windows. En versiones anteriores de Windows, Windows limitó un proceso a un grupo de CPU. Por lo tanto, GC sólo utilizó un grupo de CPU a menos que utilizara esta configuración para habilitar varios grupos de CPU. Esta limitación del sistema operativo se eliminó en Windows 11 y Server 2022. Además, a partir de .NET 7, GC usa de forma predeterminada todos los grupos de CPU cuando se ejecutan en Windows 11 o Server 2022.

  • Se aplica a la recolección de elementos no utilizados del servidor solo en sistemas operativos de 64 bits de Windows.

  • Predeterminado: GC no se extiende por los grupos de CPU. Esto es equivalente a establecer el valor en 0.

  • Para más información, consulte la publicación del blog de Maoni Stephens sobre la mejora de la configuración de la CPU para la GC en máquinas con > 64 CPU.

Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.CpuGroup false: deshabilitado.
true: habilitado.
.NET 5
Variable del entorno COMPlus_GCCpuGroup 0: deshabilitado.
1: habilitado.
.NET Core 1.0
Variable del entorno DOTNET_GCCpuGroup 0: deshabilitado.
1: habilitado.
.NET 6
app.config para .NET Framework GCCpuGroup false: deshabilitado.
true: habilitado.

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Nota:

Para configurar Common Language Runtime (CLR) con el fin de distribuir también los subprocesos del grupo de subprocesos entre todos los grupos de CPU, habilite la opción Elemento Thread_UseAllCpuGroups. En el caso de las aplicaciones de .NET Core, se puede habilitar esta opción estableciendo el valor de la variable de entorno DOTNET_Thread_UseAllCpuGroups en 1.

Affinitize (Afinidad)

  • Especifica si establecer afinidad entre subprocesos de recolección de elementos no utilizados con procesadores. El hecho de establecer afinidad entre un subproceso de GC significa que solo puede ejecutarse en su CPU concreta. Se crea un montón para cada subproceso de GC.
  • Solo se aplica a la recolección de elementos no utilizados del servidor.
  • Predeterminado: establecer afinidad entre subprocesos de recolección de elementos no utilizados con procesadores. Esto es equivalente a establecer el valor en false.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.NoAffinitize false: establecer afinidad.
true: no establecer afinidad.
.NET Core 3.0
Variable del entorno COMPlus_GCNoAffinitize 0: establecer afinidad.
1: no establecer afinidad.
.NET Core 3.0
Variable del entorno DOTNET_GCNoAffinitize 0: establecer afinidad.
1: no establecer afinidad.
.NET 6
app.config para .NET Framework GCNoAffinitize false: establecer afinidad.
true: no establecer afinidad.
.NET Framework 4.6.2

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.NoAffinitize": true
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.NoAffinitize": true
   }
}

Heap limit (Límite del montón)

  • Especifica el tamaño máximo de confirmación, en bytes, para el montón de GC y la contabilidad de GC.

  • Esta configuración solo se aplica a los equipos de 64 bits.

  • Este valor se omite si se configuran los límites por cada montón de objetos.

  • El valor predeterminado, que solo se aplica en ciertos casos, es el mayor de 20 MB o de 75 % del límite de memoria del contenedor. El valor predeterminado se aplica si:

Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimit valor decimal .NET Core 3.0
Variable del entorno COMPlus_GCHeapHardLimit valor hexadecimal .NET Core 3.0
Variable del entorno DOTNET_GCHeapHardLimit valor hexadecimal .NET 6

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapHardLimit": 209715200
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapHardLimit": 209715200
   }
}

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para especificar un límite de montón de 200 mebibytes (MiB), los valores serían 209715200 para el archivo JSON y 0xC800000 o C800000 para la variable de entorno.

Heap limit percent (Límite del montón (porcentaje))

  • Especifica el uso del montón de GC permitido como porcentaje de la memoria física total.

  • Si también se establece System.GC.HeapHardLimit, este valor se omite.

  • Esta configuración solo se aplica a los equipos de 64 bits.

  • Si el proceso se ejecuta dentro de un contenedor que tiene un límite de memoria especificado, el porcentaje se calcula como un porcentaje de ese límite de memoria.

  • Este valor se omite si se configuran los límites por cada montón de objetos.

  • El valor predeterminado, que solo se aplica en ciertos casos, es el mayor de 20 MB o de 75 % del límite de memoria del contenedor. El valor predeterminado se aplica si:

    • El proceso se ejecuta dentro de un contenedor que tiene un límite de memoria especificado.
    • No se ha establecido System.GC.HeapHardLimit.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitPercent valor decimal .NET Core 3.0
Variable del entorno COMPlus_GCHeapHardLimitPercent valor hexadecimal .NET Core 3.0
Variable del entorno DOTNET_GCHeapHardLimitPercent valor hexadecimal .NET 6

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapHardLimitPercent": 30
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapHardLimitPercent": 30
   }
}

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para limitar el uso del montón al 30 %, los valores serían 30 para el archivo JSON y 0x1E o 1E para la variable de entorno.

Límites por cada montón de objetos

Puede especificar el uso de montones permitidos de la recolección de elementos no utilizados por cada objeto. Los diferentes montones son el montón de objetos grandes (LOH), el montón de objetos pequeños (SOH) y el montón de objetos anclados (POH).

  • Si especifica un valor para DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH o DOTNET_GCHeapHardLimitPOH, también debe especificar un valor para DOTNET_GCHeapHardLimitSOH y DOTNET_GCHeapHardLimitLOH. Si no lo hace, el runtime no se inicializará.
  • El valor predeterminado para DOTNET_GCHeapHardLimitPOH es 0. DOTNET_GCHeapHardLimitSOH y DOTNET_GCHeapHardLimitLOH no tienen valores predeterminados.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitSOH valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitSOH valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitSOH valor hexadecimal .NET 6
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitLOH valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitLOH valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitLOH valor hexadecimal .NET 6
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitPOH valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitPOH valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitPOH valor hexadecimal .NET 6

Esta configuración no tiene propiedades específicas de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para especificar un límite de montón de 200 mebibytes (MiB), los valores serían 209715200 para el archivo JSON y 0xC800000 o C800000 para la variable de entorno.

Per-object-heap limit percents (Límite por montón de objetos (porcentaje))

Puede especificar el uso de montones permitidos de la recolección de elementos no utilizados por cada objeto. Los diferentes montones son el montón de objetos grandes (LOH), el montón de objetos pequeños (SOH) y el montón de objetos anclados (POH).

  • Si especifica un valor para DOTNET_GCHeapHardLimitSOHPercent, DOTNET_GCHeapHardLimitLOHPercent o DOTNET_GCHeapHardLimitPOHPercent, también debe especificar un valor para DOTNET_GCHeapHardLimitSOHPercent y DOTNET_GCHeapHardLimitLOHPercent. Si no lo hace, el runtime no se inicializará.
  • Estos valores se omiten si se especifican DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH y DOTNET_GCHeapHardLimitPOH.
  • Un valor de 1 significa que la recolección de elementos no utilizados usa el 1 % de la memoria física total para ese montón de objetos.
  • Cada valor debe ser mayor que cero y menor o igual que 100. Además, la suma de los tres valores de porcentaje debe ser inferior a 100. En caso contrario, el runtime no se inicializará.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitSOHPercent valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitSOHPercent valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitSOHPercent valor hexadecimal .NET 6
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitLOHPercent valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitLOHPercent valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitLOHPercent valor hexadecimal .NET 6
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HeapHardLimitPOHPercent valor decimal .NET 5
Variable del entorno COMPlus_GCHeapHardLimitPOHPercent valor hexadecimal .NET 5
Variable del entorno DOTNET_GCHeapHardLimitPOHPercent valor hexadecimal .NET 6

Esta configuración no tiene propiedades específicas de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para limitar el uso del montón al 30 %, los valores serían 30 para el archivo JSON y 0x1E o 1E para la variable de entorno.

High memory percent (Uso de memoria alto (porcentaje))

La carga de memoria se indica mediante el porcentaje de memoria física en uso. De forma predeterminada, cuando la carga de memoria física alcanza el 90 % , la recolección de elementos no utilizados se vuelve más agresiva a la hora de realizar recolecciones de elementos no utilizados completas y compactas para evitar la paginación. Cuando la carga de memoria está por debajo del 90 %, la recolección de elementos no utilizados favorece las recolecciones en segundo plano de recolecciones de elementos no utilizados completas, que tienen pausas más cortas pero no reducen mucho el tamaño total del montón. En los equipos con una cantidad de memoria considerable (80 GB o más), el umbral de carga predeterminado está entre el 90 % y el 97 %.

El umbral de carga de uso de memoria alto se puede ajustar mediante la variable de entorno DOTNET_GCHighMemPercent o la opción de configuración JSON System.GC.HighMemoryPercent. Considere la posibilidad de ajustar el umbral si quiere controlar el tamaño del montón. Por ejemplo, en el proceso dominante de un equipo con 64 GB de memoria, es razonable que la recolección de elementos no utilizados empiece a reaccionar cuando haya un 10 % de memoria disponible. Pero en el caso de procesos más pequeños, por ejemplo, un proceso que solo usa 1 GB de memoria, la recolección de elementos no utilizados puede ejecutarse cómodamente con menos del 10 % de memoria disponible. En estos procesos más pequeños, considere la posibilidad de establecer un umbral más alto. Por otro lado, si quiere que los procesos más grandes tengan tamaños de montón más pequeños (incluso cuando haya mucha memoria física disponible), la reducción de este umbral es una manera eficaz de que la recolección de elementos no utilizados reaccione antes para reducir el montón.

Nota

En el caso de los procesos que se ejecutan en un contenedor, la recolección de elementos no utilizados considera la memoria física según el límite del contenedor.

Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.HighMemoryPercent valor decimal .NET 5
Variable del entorno COMPlus_GCHighMemPercent valor hexadecimal .NET Core 3.0
.NET Framework 4.7.2
Variable del entorno DOTNET_GCHighMemPercent valor hexadecimal .NET 6

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para establecer el umbral de uso de memoria alto en el 75 %, los valores serían 75 para el archivo JSON y 0x4B o 4B para la variable de entorno.

Retain VM (Conservar VM)

  • Configura si los segmentos que se deben eliminar se ponen en una lista en espera para usarlos en el futuro o se devuelven al sistema operativo (SO).
  • Predeterminado: devolver los segmentos al sistema operativo. Esto es equivalente a establecer el valor en false.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.RetainVM false: liberar al sistema operativo.
true: poner en espera.
.NET Core 1.0
Propiedad de MSBuild RetainVMGarbageCollection false: liberar al sistema operativo.
true: poner en espera.
.NET Core 1.0
Variable del entorno COMPlus_GCRetainVM 0: liberar al sistema operativo.
1: poner en espera.
.NET Core 1.0
Variable del entorno DOTNET_GCRetainVM 0: liberar al sistema operativo.
1: poner en espera.
.NET 6

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.RetainVM": true
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.RetainVM": true
   }
}

Archivo del proyecto:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
  </PropertyGroup>

</Project>

Páginas grandes

  • Especifica si se deben usar páginas grandes cuando se establece un límite máximo de montones.
  • Predeterminado: no utilizar páginas grandes cuando se establezca un límite rígido de montones. Esto es equivalente a establecer el valor en 0.
  • Se trata de un valor de configuración experimental.
Nombre de valor Valores Versión introducida
runtimeconfig.json N/D N/D N/D
Variable del entorno COMPlus_GCLargePages 0: deshabilitado.
1: habilitado.
.NET Core 3.0
Variable del entorno DOTNET_GCLargePages 0: deshabilitado.
1: habilitado.
.NET 6

Allow large objects (Permitir objetos grandes)

  • Configura la compatibilidad del recolector de elementos no utilizados en plataformas de 64 bits para matrices de más de 2 gigabytes (GB) de tamaño total.
  • Predeterminado: GC admite matrices de más de 2 GB. Esto es equivalente a establecer el valor en 1.
  • Esta opción puede quedar obsoleta en una versión futura de .NET.
Nombre de valor Valores Versión introducida
runtimeconfig.json N/D N/D N/D
Variable del entorno COMPlus_gcAllowVeryLargeObjects 1: habilitado.
0: deshabilitado.
.NET Core 1.0
Variable del entorno DOTNET_gcAllowVeryLargeObjects 1: habilitado.
0: deshabilitado.
.NET 6
app.config para .NET Framework gcAllowVeryLargeObjects 1: habilitado.
0: deshabilitado.
.NET Framework 4.5

Umbral del montón de objetos grandes

  • Especifica el tamaño del umbral, en bytes, que provoca que los objetos vayan al montón de objetos grandes (LOH).
  • El valor predeterminado del umbral es de 85 000 bytes.
  • El valor que especifique debe ser mayor que el umbral predeterminado.
  • El tiempo de ejecución podría limitar el valor al tamaño máximo posible para la configuración actual. Puede inspeccionar el valor en uso en tiempo de ejecución a través de la API de GC.GetConfigurationVariables().
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.LOHThreshold valor decimal .NET Core 1.0
Variable del entorno COMPlus_GCLOHThreshold valor hexadecimal .NET Core 1.0
Variable del entorno DOTNET_GCLOHThreshold valor hexadecimal .NET 6
app.config para .NET Framework GCLOHThreshold valor decimal .NET Framework 4.8

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplos

Archivo runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.LOHThreshold": 120000
      }
   }
}

archivo runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.LOHThreshold": 120000
   }
}

Sugerencia

Si configura la opción en runtimeconfig.json, especifique un valor decimal. Si configura la opción como una variable de entorno, especifique un valor hexadecimal. Por ejemplo, para establecer un tamaño de umbral de 120 000 bytes, los valores serían 120000 para el archivo JSON y 0x1D4C0 o 1D4C0 para la variable de entorno.

GC independiente

  • Especifica el nombre de una biblioteca nativa de GC que el tiempo de ejecución se carga en lugar de la implementación de GC predeterminada. Esta biblioteca nativa debe residir en el mismo directorio que el entorno de ejecución de .NET (coreclr.dll en Windows, libcoreclr.so en Linux).
Nombre de valor Valores Versión introducida
runtimeconfig.json N/D N/D N/D
Variable del entorno COMPlus_GCName string_path .NET Core 2.0
Variable del entorno DOTNET_GCName string_path .NET 6

Conservación de memoria

  • Configura el recolector de elementos no utilizados para conservar memoria a cambio de recolecciones de elementos no utilizados más frecuentes y, posiblemente, tiempos de pausa más largos.
  • El valor predeterminado es 0: esto no implica ningún cambio.
  • Además del valor predeterminado 0, los valores entre 1 y 9 (ambos incluidos) son válidos. Cuanto mayor sea el valor, más intentará el recolector de elementos no utilizados conservar la memoria y, por tanto, mantener el tamaño del montón reducido.
  • Si el valor es distinto de cero, el montón de objetos de gran tamaño se compactará automáticamente cuando tenga demasiada fragmentación.
Nombre de valor Valores Versión introducida
runtimeconfig.json System.GC.ConserveMemory 0 - 9 .NET 6
Variable del entorno COMPlus_GCConserveMemory 0 -9 .NET Framework 4.8
Variable de entorno DOTNET_GCConserveMemory 0 -9 .NET 6
app.config para .NET Framework GCConserveMemory 0 -9 .NET Framework 4.8

Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento RuntimeHostConfigurationOption de MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributo Include. Para obtener un ejemplo, consulte propiedades de MSBuild.

Ejemplo de archivo app.config:


<configuration>
  <runtime>
    <GCConserveMemory enabled="5"/>
  </runtime>
</configuration>

Sugerencia

Experimente con números diferentes para ver qué valor funciona mejor. Comience con un valor entre 5 y 7.