Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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. La configuración que se puede cambiar a través de las API en tiempo de ejecución, como el nivel de latencia, se omite de 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 deCOMPlus_. Sin embargo, elCOMPlus_prefijo sigue funcionando. Si usa una versión anterior del runtime de .NET, debe seguir usando el prefijoCOMPlus_, 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 |
|---|---|---|---|
| archivo runtimeconfig.json o archivo deruntimeconfig.template.json |
.NET (Core) | n | n se interpreta como un valor decimal. |
| Variable del entorno | .NET Framework, .NET | 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 otros sistemas operativos con .NET 6 o una versión posterior:
export DOTNET_gcServer=1
export DOTNET_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 | 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 | 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>
GC independiente
Para usar un recolector de elementos no utilizados independiente en lugar de la implementación predeterminada de GC, puede especificar la ruta de acceso (en .NET 9 y versiones posteriores) o el nombre de una biblioteca nativa de GC.
Ruta
- Especifica la ruta de acceso completa de una biblioteca nativa de GC que el tiempo de ejecución carga en lugar de la implementación predeterminada de GC. Para ser seguro, esta ubicación debe protegerse frente a alteraciones potencialmente malintencionadas.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.Path |
string_path | .NET 9 |
| Variable del entorno | DOTNET_GCPath |
string_path | .NET 9 |
Nombre
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. El comportamiento ha cambiado en .NET 9 con la introducción de la configuración de ruta de acceso .
En .NET 8 y versiones anteriores:
- Si solo se especifica un nombre de la biblioteca, la biblioteca debe residir en el mismo directorio que el entorno de ejecución de .NET (coreclr.dll en Windows, libcoreclr.so en Linux o libcoreclr.dylib en OSX).
- El valor también puede ser una ruta de acceso relativa, por ejemplo, si especifica ".. \clrgc.dll" en Windows, clrgc.dll se carga desde el directorio primario del directorio en tiempo de ejecución de .NET.
En .NET 9 y versiones posteriores, este valor especifica un nombre de archivo solo (no se permiten rutas de acceso):
- .NET busca el nombre que especifique en el directorio donde reside el ensamblado que contiene el método de la
Mainaplicación. - Si no se encuentra el archivo, se busca en el directorio en tiempo de ejecución de .NET.
Esta configuración se omite si se especifica la configuración de ruta de acceso.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.Name |
string_name | .NET 7 |
| Variable del entorno | DOTNET_GCName |
string_name | .NET 6 |
Configuración específica de LOH
Permitir objetos muy 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 | 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 GC.GetConfigurationVariables() API.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.LOHThreshold |
valor decimal | .NET Core 3.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.
Administración del uso de recursos para todos los tipos de GC
La siguiente configuración se aplica a todos los tipos del GC:
- Límite máximo de montón
- Porcentaje de límite máximo del montón
- Límites físicos por montón de objetos
- Porcentajes de límite máximo de montón por objeto
- Páginas grandes
- Intervalo de regiones
- Tamaño de la región
- High memory percent (Uso de memoria alto (porcentaje))
- Retain VM (Conservar VM)
- Conservación de la memoria
Límite máximo de montón
- El límite máximo de memoria se define como el tamaño máximo de confirmación, en bytes, para el montón de GC y el mantenimiento de la contabilidad de GC.
- Esta configuración solo se aplica a los equipos de 64 bits.
- Si se ejecuta en un entorno con restricción de memoria (por ejemplo, un contenedor) y este valor no está establecido, el valor predeterminado es de 20 MB o el porcentaje de límite máximo del montón del límite de contenedor, lo que sea mayor.
- Esta configuración se omite si se configuran los límites físicos del montón por objeto.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimit |
valor decimal | .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.
Porcentaje de límite máximo del montón
- Especifica el límite máximo del montón como un porcentaje de memoria física total.
- Si el proceso se ejecuta dentro de un entorno con un límite de memoria establecido (por ejemplo, un contenedor), ese límite se trata como la memoria física total. En estos entornos, el valor predeterminado es 75%.
- Esta configuración solo se aplica a los equipos de 64 bits.
- Esta configuración se omite si se configuran los límites duros del montón por objeto o si se configura el límite máximo del montón.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitPercent |
valor decimal | .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 físicos por montón de objetos
Puede especificar el límite máximo del montón del GC por montón por 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_GCHeapHardLimitLOHoDOTNET_GCHeapHardLimitPOH, también debe especificar un valor paraDOTNET_GCHeapHardLimitSOHyDOTNET_GCHeapHardLimitLOH. Si no lo hace, el runtime no se inicializará. - El valor predeterminado para
DOTNET_GCHeapHardLimitPOHes 0.DOTNET_GCHeapHardLimitSOHyDOTNET_GCHeapHardLimitLOHno tienen valores predeterminados.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitSOH |
valor decimal | .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 | 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 | 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.
Porcentajes de límite máximo de montón por objeto
Puede especificar el límite máximo del montón del GC por montón por 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_GCHeapHardLimitLOHPercentoDOTNET_GCHeapHardLimitPOHPercent, también debe especificar un valor paraDOTNET_GCHeapHardLimitSOHPercentyDOTNET_GCHeapHardLimitLOHPercent. Si no lo hace, el runtime no se inicializará. - Estos valores se omiten si se especifican
DOTNET_GCHeapHardLimitSOH,DOTNET_GCHeapHardLimitLOHyDOTNET_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 | 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 | 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 | 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.
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 | DOTNET_GCLargePages |
0: deshabilitado.1: habilitado. |
.NET 6 |
Intervalo de regiones
A partir de .NET 7, el montón de GC cambió su representación física de segmentos a regiones para Windows y Linux de 64 bits. (Para obtener más información, consulte el artículo de blog de Maoni Stephens). Con este cambio, el GC reserva un intervalo de memoria virtual durante la inicialización. Tenga en cuenta que esto solo reserva memoria, no confirmando (el tamaño del montón de GC es memoria confirmada). Es simplemente un intervalo para definir el intervalo máximo que puede confirmar el montón de GC. La mayoría de las aplicaciones no necesitan confirmar casi esto.
Si no tiene ninguna otra configuración y no se ejecuta en un entorno con restricciones de memoria (lo que provocaría que se establezcan algunas configuraciones de GC), de forma predeterminada se reservan 256 GB. Si tiene más de 256 GB de memoria física disponible, será el doble de esa cantidad.
Si se establecen los límites máximos por montón, el intervalo de reserva es el mismo que el límite máximo total. Si se establece una configuración de límite máximo único, este intervalo es cinco veces esa cantidad.
Este intervalo está limitado por la cantidad de memoria virtual total. Normalmente en 64 bits esto nunca es un problema, pero podría haber un límite de memoria virtual establecido en un proceso. Este intervalo está limitado por la mitad de esa cantidad. Por ejemplo, si establece la HeapHardLimit configuración en 1 GB y tiene un límite de memoria virtual de 4 GB establecido en el proceso, este intervalo es , que es min (5x1GB, 4GB/2)de 2 GB.
Puede usar la GC.GetConfigurationVariables() API para ver el valor de este intervalo bajo el nombre GCRegionRange. Si se obtiene E_OUTOFMEMORY durante la inicialización en tiempo de ejecución y quiere ver si se debe a reservar este intervalo, examine la VirtualAlloc llamada con MEM_RESERVE en Windows o la llamada con mmap en Linux, durante la PROT_NONE inicialización de GC y vea si el OOM es de esa llamada. Si se produce un error en esta llamada de reserva, puede cambiarla a través de las siguientes opciones de configuración. La recomendación para el importe de la reserva es de dos a cinco veces el tamaño confirmado para el montón de GC. Si su escenario no realiza muchas asignaciones grandes (esto podría ser cualquier asignación en UOH o mayor que el tamaño de la región UOH), dos veces el tamaño confirmado debe ser seguro. De lo contrario, es posible que quiera hacer que sea más grande, por lo que no incurre en GCs demasiado compactos para hacer espacio para esas regiones más grandes. Si no conoce el tamaño confirmado del montón de GC, puede establecerlo en dos veces la cantidad de memoria física disponible para el proceso.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.RegionRange |
valor decimal | .NET 10 |
| Variable del entorno | DOTNET_GCRegionRange |
valor hexadecimal | .NET 7 |
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.
Tamaño de la región
A partir de .NET 7, el montón de GC cambió su representación física de segmentos a regiones para Windows y Linux de 64 bits. (Para obtener más información, consulte el artículo de blog de Maoni Stephens). De forma predeterminada, cada región es de 4 MB para SOH. Para UOH (LOH y POH), es ocho veces el tamaño de la región SOH. Puede usar esta configuración para cambiar el tamaño de la región SOH y las regiones UOH se ajustarán en consecuencia.
Las regiones solo se asignan cuando es necesario, por lo que, en general, no es necesario preocuparse por el tamaño de la región. Sin embargo, hay dos casos en los que es posible que desee ajustar este tamaño:
- Para los procesos que tienen montones de GC muy pequeños, cambiar el tamaño de la región a ser menor es beneficioso para el uso de memoria nativa de la propia contabilidad de GC. La recomendación es de 1 MB.
- En Linux, si necesita reducir el número de asignaciones de memoria, puede cambiar el tamaño de la región para que sea mayor, por ejemplo, 32 MB.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.RegionSize |
valor decimal | .NET 10 |
| Variable del entorno | DOTNET_GCRegionSize |
valor hexadecimal | .NET 7 |
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.
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 | 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 | 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>
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 | 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.
Administración del uso de recursos para gc de servidor
La siguiente configuración afecta al número de subprocesos de GC del servidor y a la forma en que se afinidadizan con los núcleos. No tienen ningún efecto en gc de estación de trabajo.
- Heap count (Recuento de montones)
- Affinitize (Afinidad)
- Affinitize mask (Máscara de afinidad)
- Affinitize ranges (Intervalos de afinidad)
- Grupos de CPU
- DATOS
Para obtener más información sobre la primera configuración 3, consulte la entrada de blog middle ground between workstation and server GC (Nivel intermedio entre estación de trabajo y GC 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
nmontones o subprocesos de GC en los primerosnprocesadores. (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 | 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 (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 | 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
}
}
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 | 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 | 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 | 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.
Adaptación dinámica a tamaños de aplicación (DATAS)
Habilitación o deshabilitación de DATAS
- Configura el recolector de elementos no utilizados para usar DATAS. DATAS se adapta a los requisitos de memoria de la aplicación, lo que significa que el tamaño del montón de la aplicación debe ser aproximadamente proporcional al tamaño de datos de larga duración.
- Habilitado de forma predeterminada a partir de .NET 9.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| Variable del entorno | DOTNET_GCDynamicAdaptationMode |
1: habilitado.0: deshabilitado. |
.NET 8 |
| Propiedad de MSBuild | GarbageCollectionAdaptationMode |
1: habilitado.0: deshabilitado. |
.NET 8 |
| runtimeconfig.json | System.GC.DynamicAdaptationMode |
1: habilitado.0: deshabilitado. |
.NET 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.
TCP de destino
DATAS usa el porcentaje de costo de rendimiento (TCP) como medida del costo de memoria en el rendimiento. Tiene en cuenta tanto las pausas de GC como la cantidad de asignaciones que deben esperar. Normalmente, las pausas de GC dominan, por lo que puede usar el "% tiempo de pausa en GC" para aproximar este costo. Hay dos casos transitorios en los que el tiempo de espera de asignación puede dominar:
- Cuando se inicia un proceso, DATAS siempre comienza con un montón. Por lo tanto, si hay suficientes subprocesos que asignan, experimentan esperas.
- Cuando la carga de trabajo cambia de más ligera a pesada, por ejemplo, cuando se inician las horas punta, la asignación de subprocesos podría experimentar esperas durante ese período de tiempo. Esto se debe a que se tardan algunos GCs antes de aumentar el número de montones.
DATAS usa 2% como TCP predeterminado, que puede ajustar con esta configuración. Es un entero que se interpreta como un porcentaje, por ejemplo, 5 significa que el TCP de destino será 5%.
| Nombre de valor | Valores | Versión introducida | |
|---|---|---|---|
| runtimeconfig.json | System.GC.DTargetTCP |
valor decimal | .NET 9 |
| Variable del entorno | DOTNET_GCDTargetTCP |
valor hexadecimal | .NET 9 |
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.
Configuración de presupuesto máxima de Gen0
Ajustar el presupuesto de gen0 es uno de los elementos clave que DATAS usa para adaptarse a los tamaños de la aplicación. DATAS define un umbral superior denominado BCD (presupuesto calculado a través de DATAS) para el presupuesto total gen0 como función del tamaño de la aplicación. La fórmula para calcular un multiplicador es la siguiente:
$$ f(\text{application_size_in_MB}) = \frac{20 - \text{conserve_memory}}{\sqrt{\text{application_size_in_MB}}} $$
A continuación, la fórmula se fija mediante un valor máximo y mínimo antes de aplicarla al tamaño de la aplicación en MB. Si no se especifica la configuración de conservación de memoria , DATAS usa 5 de forma predeterminada. El valor máximo y mínimo predeterminado es 10 y 0,1, respectivamente.
Por ejemplo, si el tamaño de la aplicación es de 1 GB, la fórmula calcula (20 - 5) / sqrt (1000) = 0.474. Puesto que está entre 10 y 0,1, la fijación no tiene ningún efecto. Esto significa que el presupuesto total de gen0 es de 47,4% de 1 GB, que es de 474 MB. Si el tamaño de la aplicación es de 1 MB, la fórmula calcularía 15, lo que se ajustaría a 10, lo que significa que el presupuesto total de gen0 permitido es de 10 MB.
Se proporcionan tres valores para ajustar lo que calcula la fórmula y modificar los valores de fijación:
Porcentaje que se aplicará a lo que
fcalcula.Nombre de valor Valores Versión introducida runtimeconfig.json System.GC.DGen0GrowthPercentvalor decimal .NET 10 Variable del entorno DOTNET_GCDGen0GrowthPercentvalor hexadecimal .NET 10 Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento
RuntimeHostConfigurationOptionde MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributoInclude. Para obtener un ejemplo, consulte propiedades de MSBuild.Por lo tanto, si
fcalcula 0,474 y este valor es 200, el multiplicador se convierte0.474 * 200% = 0.948antes de aplicar la fijación.Valor máximo de fijación en permil.
Nombre de valor Valores Versión introducida runtimeconfig.json System.GC.DGen0GrowthMaxFactorvalor decimal .NET 10 Variable del entorno DOTNET_GCDGen0GrowthMaxFactorvalor hexadecimal .NET 10 Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento
RuntimeHostConfigurationOptionde MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributoInclude. Para obtener un ejemplo, consulte propiedades de MSBuild.Si este valor es 20000, significa que el valor máximo de fijación es
20000 * 0.001 = 20.Valor mínimo de fijación en permil.
Nombre de valor Valores Versión introducida runtimeconfig.json System.GC.DGen0GrowthMinFactorvalor decimal .NET 10 Variable del entorno DOTNET_GCDGen0GrowthMinFactorvalor hexadecimal .NET 10 Esta configuración no tiene una propiedad específica de MSBuild. Sin embargo, puede agregar un elemento
RuntimeHostConfigurationOptionde MSBuild en su lugar. Use el nombre de la configuración runtimeconfig.json como valor del atributoInclude. Para obtener un ejemplo, consulte propiedades de MSBuild.Si este valor es 200, el valor mínimo de fijación es
200 * 0.001 = 0.2.