Opções de configuração de tempo de execução para coleta de lixo
Esta página contém informações sobre configurações para o coletor de lixo (GC) de tempo de execução do .NET. Se você estiver tentando atingir o desempenho máximo de um aplicativo em execução, considere usar essas configurações. No entanto, os padrões fornecem um desempenho ideal para a maioria dos aplicativos em situações típicas.
As configurações são organizadas em grupos nesta página. As configurações dentro de cada grupo são comumente usadas em conjunto umas com as outras para alcançar um resultado específico.
Nota
- Essas configurações só são lidas pelo tempo de execução quando o GC é inicializado (geralmente isso significa durante o tempo de inicialização do processo). Se você alterar uma variável de ambiente quando um processo já estiver em execução, a alteração não será refletida nesse processo. As configurações que podem ser alteradas por meio de APIs em tempo de execução, como o nível de latência, são omitidas desta página.
- Como o GC é por processo, raramente faz sentido definir essas configurações no nível da máquina. Por exemplo, você não gostaria que todos os processos .NET em uma máquina usassem o GC do servidor ou o mesmo limite rígido de heap.
- Para valores numéricos, use notação decimal para configurações no arquivo runtimeconfig.json ou runtimeconfig.template.json e notação hexadecimal para configurações de variáveis de ambiente. Para valores hexadecimais, você pode especificá-los com ou sem o prefixo "0x".
- Se você estiver usando as variáveis de ambiente, o .NET 6 e versões posteriores padronizarão no prefixo
DOTNET_
em vez deCOMPlus_
. No entanto, o prefixoCOMPlus_
continuará a funcionar. Se você estiver usando uma versão anterior do tempo de execução do .NET, ainda deverá usar o prefixoCOMPlus_
, por exemplo,COMPlus_gcServer
.
Maneiras de especificar a configuração
Para diferentes versões do tempo de execução do .NET, há diferentes maneiras de especificar os valores de configuração. A tabela a seguir mostra um resumo.
Local de configuração | Versões do .NET às quais esse local se aplica | Formatos | Como é interpretado |
---|---|---|---|
runtimeconfig.json arquivo/ arquivo runtimeconfig.template.json |
.NET (Core) | n | n é interpretado como um valor decimal. |
Variável de ambiente | .NET Framework, .NET (Core) | 0xn ou n | n é interpretado como um valor hexadecimal em qualquer formato |
arquivo app.config | .NET Framework | 0xn | n é interpretado como um valorhexadecimal 1 |
1 Você pode especificar um valor sem o prefixo 0x
para uma configuração de arquivo app.config, mas isso não é recomendado. No .NET Framework 4.8+, devido a um bug, um valor especificado sem o prefixo 0x
é interpretado como hexadecimal, mas em versões anteriores do .NET Framework, ele é interpretado como decimal. Para evitar ter que alterar sua configuração, use o prefixo 0x
ao especificar um valor em seu arquivo app.config.
Por exemplo, para especificar 12 heaps para GCHeapCount
um aplicativo .NET Framework chamado A.exe, adicione o seguinte XML ao arquivo A.exe.config .
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<runtime>
<gcServer enabled="true"/>
<GCHeapCount>0xc</GCHeapCount>
</runtime>
</configuration>
Para .NET (Core) e .NET Framework, você pode usar variáveis de ambiente.
No Windows usando o .NET 6 ou uma versão posterior:
SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c
No Windows usando .NET 5 ou anterior:
SET COMPlus_gcServer=1
SET COMPlus_GCHeapCount=c
Em outros sistemas operacionais:
Para .NET 6 ou versões posteriores:
export DOTNET_gcServer=1
export DOTNET_GCHeapCount=c
Para .NET 5 e versões anteriores:
export COMPlus_gcServer=1
export COMPlus_GCHeapCount=c
Se você não estiver usando o .NET Framework, também poderá definir o valor no arquivo runtimeconfig.json ou runtimeconfig.template.json .
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true,
"System.GC.HeapCount": 12
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.Server": true,
"System.GC.HeapCount": 12
}
}
Sabores da coleta de lixo
Os dois principais sabores de coleta de lixo são GC estação de trabalho e GC servidor. Para obter mais informações sobre as diferenças entre os dois, consulte Estação de trabalho e coleta de lixo do servidor.
Os subsabores da coleta de lixo são de fundo e não concorrentes.
Use as seguintes configurações para selecionar os tipos de coleta de lixo:
Estação de trabalho vs. servidor
- Configura se o aplicativo usa a coleta de lixo da estação de trabalho ou a coleta de lixo do servidor.
- Padrão: coleta de lixo da estação de trabalho. Isso equivale a definir o valor como
false
.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.Server |
false - estação de trabalhotrue - servidor |
.NET Core 1.0 |
Propriedade MSBuild | ServerGarbageCollection |
false - estação de trabalhotrue - servidor |
.NET Core 1.0 |
Variável de ambiente | COMPlus_gcServer |
0 - estação de trabalho1 - servidor |
.NET Core 1.0 |
Variável de ambiente | DOTNET_gcServer |
0 - estação de trabalho1 - servidor |
.NET 6 |
app.config para .NET Framework | GCServer | false - estação de trabalhotrue - servidor |
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.Server": true
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
</Project>
GC de fundo
- Configura se a coleta de lixo em segundo plano (simultânea) está habilitada.
- Padrão: Use GC em segundo plano. Isso equivale a definir o valor como
true
. - Para obter mais informações, consulte Coleta de lixo em segundo plano.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.Concurrent |
true - GC de fundofalse - GC não concorrente |
.NET Core 1.0 |
Propriedade MSBuild | ConcurrentGarbageCollection |
true - GC de fundofalse - GC não concorrente |
.NET Core 1.0 |
Variável de ambiente | COMPlus_gcConcurrent |
1 - GC de fundo0 - GC não concorrente |
.NET Core 1.0 |
Variável de ambiente | DOTNET_gcConcurrent |
1 - GC de fundo0 - GC não concorrente |
.NET 6 |
app.config para .NET Framework | gcSimultâneo | true - GC de fundofalse - GC não concorrente |
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.Concurrent": false
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.Concurrent": false
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup>
</Project>
Gerenciar o uso de recursos
Use as seguintes configurações para gerenciar a memória do coletor de lixo e o uso do processador:
- Afinitizar
- Máscara Affinitize
- Gamas de afinitização
- Grupos de CPU
- Contagem de pilha
- Limite rígido de pilha
- Percentagem de limite rígido de pilha
- Limites rígidos por heap de objeto
- Percentagens de limite rígido por heap de objeto
- Alta porcentagem de memória
- Reter VM
Para obter mais informações sobre algumas dessas configurações, consulte a entrada de blog Meio termo entre a estação de trabalho e o servidor GC .
Contagem de pilha
- Limita o número de pilhas criadas pelo coletor de lixo.
- Aplica-se apenas à coleta de lixo do servidor.
- Se a afinidade do processador GC estiver habilitada, que é o padrão, a configuração de contagem de heap afiliará
n
heaps/threads GC aos primeirosn
processadores. (Use as configurações affinitize mask ou affinitize ranges para especificar exatamente quais processadores afinitizar.) - Se a afinidade do processador GC estiver desativada, essa configuração limitará o número de heaps GC.
- Para obter mais informações, consulte as observações do GCHeapCount.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapCount |
valor decimal | .NET Core 3.0 |
Variável de ambiente | COMPlus_GCHeapCount |
valor hexadecimal | .NET Core 3.0 |
Variável de ambiente | DOTNET_GCHeapCount |
valor hexadecimal | .NET 6 |
app.config para .NET Framework | GCHeapCount | valor decimal | .NET Framework 4.6.2 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapCount": 16
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.HeapCount": 16
}
}
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para limitar o número de heaps a 16, os valores seriam 16 para o arquivo JSON e 0x10 ou 10 para a variável de ambiente.
Máscara Affinitize
- Especifica os processadores exatos que os threads do coletor de lixo devem usar.
- Se a afinidade do processador GC estiver desativada, essa configuração será ignorada.
- Aplica-se apenas à coleta de lixo do servidor.
- O valor é uma máscara de bits que define os processadores que estão disponíveis para o processo. Por exemplo, um valor decimal de 1023 (ou um valor hexadecimal de 0x3FF ou 3FF se você estiver usando a variável de ambiente) é 0011 1111 1111 em notação binária. Isso especifica que os primeiros 10 processadores devem ser usados. Para especificar os próximos 10 processadores, ou seja, processadores 10-19, especifique um valor decimal de 1047552 (ou um valor hexadecimal de 0xFFC00 ou FFC00), que é equivalente a um valor binário de 1111 1111 1100 0000 0000.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapAffinitizeMask |
valor decimal | .NET Core 3.0 |
Variável de ambiente | COMPlus_GCHeapAffinitizeMask |
valor hexadecimal | .NET Core 3.0 |
Variável de ambiente | DOTNET_GCHeapAffinitizeMask |
valor hexadecimal | .NET 6 |
app.config para .NET Framework | GCHeapAffinitizeMask | valor decimal | .NET Framework 4.6.2 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapAffinitizeMask": 1023
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.HeapAffinitizeMask": 1023
}
}
Gamas de afinitização
- Especifica a lista de processadores a serem usados para threads de coletor de lixo.
- Essa configuração é semelhante a System.GC.HeapAffinitizeMask, exceto que permite especificar mais de 64 processadores.
- Para sistemas operacionais Windows, prefixe o número ou intervalo do processador com o grupo de CPU correspondente, por exemplo, "0:1-10,0:12,1:50-52,1:7". Se você não tiver mais de 1 grupo de CPU, não poderá usar essa configuração. Você deve usar a configuração de máscara Affinitize. E os números especificados estão dentro desse grupo, o que significa que não pode ser >= 64.
- Para sistemas operacionais Linux, onde o conceito de grupo de CPU não existe, você pode usar essa configuração e a configuração de máscara Affinitize para especificar os mesmos intervalos. E em vez de "0:1-10", especifique "1-10" porque você não precisa especificar um índice de grupo.
- Se a afinidade do processador GC estiver desativada, essa configuração será ignorada.
- Aplica-se apenas à coleta de lixo do servidor.
- Para obter mais informações, consulte Tornando a configuração da CPU melhor para GC em máquinas com > 64 CPUs no blog de Maoni Stephens.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapAffinitizeRanges |
Lista separada por vírgulas de números de processador ou intervalos de números de processador. Exemplo Unix: "1-10,12,50-52,70" Exemplo do Windows: "0:1-10,0:12,1:50-52,1:7" |
.NET Core 3.0 |
Variável de ambiente | COMPlus_GCHeapAffinitizeRanges |
Lista separada por vírgulas de números de processador ou intervalos de números de processador. Exemplo Unix: "1-10,12,50-52,70" Exemplo do Windows: "0:1-10,0:12,1:50-52,1:7" |
.NET Core 3.0 |
Variável de ambiente | DOTNET_GCHeapAffinitizeRanges |
Lista separada por vírgulas de números de processador ou intervalos de números de processador. Exemplo Unix: "1-10,12,50-52,70" Exemplo do Windows: "0:1-10,0:12,1:50-52,1:7" |
.NET 6 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:7"
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:7"
}
}
Grupos de CPU
Configura se o coletor de lixo usa grupos de CPU ou não.
Quando um computador Windows de 64 bits tem vários grupos de CPU, ou seja, há mais de 64 processadores, habilitar esse elemento estende a coleta de lixo em todos os grupos de CPU. O coletor de lixo usa todos os núcleos para criar e equilibrar pilhas.
Nota
Este é um conceito apenas para Windows. Em versões mais antigas do Windows, o Windows limitava um processo a um grupo de CPU. Assim, o GC usou apenas um grupo de CPU, a menos que você tenha usado essa configuração para habilitar vários grupos de CPU. Essa limitação do sistema operacional foi suspensa no Windows 11 e no Server 2022. Além disso, a partir do .NET 7, o GC por padrão usa todos os grupos de CPU quando executado no Windows 11 ou Server 2022.
Aplica-se à coleta de lixo do servidor somente em sistemas operacionais Windows de 64 bits.
Padrão: o GC não se estende entre grupos de CPU. Isso equivale a definir o valor como
0
.Para obter mais informações, consulte Tornando a configuração da CPU melhor para GC em máquinas com > 64 CPUs no blog de Maoni Stephens.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.CpuGroup |
false - deficientestrue - ativado |
.NET 5 |
Variável de ambiente | COMPlus_GCCpuGroup |
0 - deficientes1 - ativado |
.NET Core 1.0 |
Variável de ambiente | DOTNET_GCCpuGroup |
0 - deficientes1 - ativado |
.NET 6 |
app.config para .NET Framework | GCCpuGroup | false - deficientestrue - ativado |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Nota
Para configurar o Common Language Runtime (CLR) para também distribuir threads do pool de threads em todos os grupos de CPU, habilite a opção Thread_UseAllCpuGroups elemento . Para aplicativos .NET Core, você pode habilitar essa opção definindo o DOTNET_Thread_UseAllCpuGroups
valor da variável de ambiente como 1
.
Afinitizar
- Especifica se os threads de coleta de lixo devem ser afinizados com processadores. Para afinitizar um thread GC significa que ele só pode ser executado em sua CPU específica. Uma pilha é criada para cada thread GC.
- Aplica-se apenas à coleta de lixo do servidor.
- Padrão: affinitize threads de coleta de lixo com processadores. Isso equivale a definir o valor como
false
.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.NoAffinitize |
false - afinitizartrue - não afinar |
.NET Core 3.0 |
Variável de ambiente | COMPlus_GCNoAffinitize |
0 - afinitizar1 - não afinar |
.NET Core 3.0 |
Variável de ambiente | DOTNET_GCNoAffinitize |
0 - afinitizar1 - não afinar |
.NET 6 |
app.config para .NET Framework | GCNoAffinitize | false - afinitizartrue - não afinar |
.NET Framework 4.6.2 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.NoAffinitize": true
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.NoAffinitize": true
}
}
Limite rígido de pilha
- O limite rígido de heap é definido como o tamanho máximo de confirmação, em bytes, para a contabilidade de heap GC e GC.
- Esta definição aplica-se apenas a computadores de 64 bits.
- Se esse limite não estiver configurado, mas o processo estiver sendo executado em um ambiente com restrição de memória, ou seja, dentro de um contêiner com um limite de memória especificado, um valor padrão será definido. Esse padrão é o maior de 20 MB ou 75% do limite de memória no contêiner.
- Essa configuração será ignorada se os limites rígidos por objeto-heap estiverem configurados.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimit |
valor decimal | .NET Core 3.0 |
Variável de ambiente | COMPlus_GCHeapHardLimit |
valor hexadecimal | .NET Core 3.0 |
Variável de ambiente | DOTNET_GCHeapHardLimit |
valor hexadecimal | .NET 6 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapHardLimit": 209715200
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.HeapHardLimit": 209715200
}
}
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para especificar um limite rígido de heap de 200 mebibytes (MiB), os valores seriam 209715200 para o arquivo JSON e 0xC800000 ou C800000 para a variável de ambiente.
Percentagem de limite rígido de pilha
- Especifica o limite rígido de pilha como uma porcentagem da memória física total. Se o processo estiver sendo executado em um ambiente com restrição de memória, ou seja, dentro de um contêiner com um limite de memória especificado, a memória física total é o limite de memória; caso contrário, é o que está disponível na máquina.
- Esta definição aplica-se apenas a computadores de 64 bits.
- Essa configuração será ignorada se os limites rígidos por objeto-heap estiverem configurados ou se o limite rígido de heap estiver configurado.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitPercent |
valor decimal | .NET Core 3.0 |
Variável de ambiente | COMPlus_GCHeapHardLimitPercent |
valor hexadecimal | .NET Core 3.0 |
Variável de ambiente | DOTNET_GCHeapHardLimitPercent |
valor hexadecimal | .NET 6 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapHardLimitPercent": 30
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.HeapHardLimitPercent": 30
}
}
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para limitar o uso de heap a 30%, os valores seriam 30 para o arquivo JSON e 0x1E ou 1E para a variável de ambiente.
Limites rígidos por heap de objeto
Você pode especificar o limite rígido de heap do GC em uma base por heap de objeto. As diferentes pilhas são a pilha de objeto grande (LOH), a pilha de objeto pequeno (SOH) e a pilha de objeto fixo (POH).
- Se você especificar um valor para qualquer uma das
DOTNET_GCHeapHardLimitSOH
configurações ,DOTNET_GCHeapHardLimitLOH
, ouDOTNET_GCHeapHardLimitPOH
, também deverá especificar um valor paraDOTNET_GCHeapHardLimitSOH
eDOTNET_GCHeapHardLimitLOH
. Se você não fizer isso, o tempo de execução falhará ao inicializar. - O valor padrão para
DOTNET_GCHeapHardLimitPOH
é 0.DOTNET_GCHeapHardLimitSOH
eDOTNET_GCHeapHardLimitLOH
não têm valores padrão.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitSOH |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitSOH |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitSOH |
valor hexadecimal | .NET 6 |
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitLOH |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitLOH |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitLOH |
valor hexadecimal | .NET 6 |
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitPOH |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitPOH |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitPOH |
valor hexadecimal | .NET 6 |
Essas definições de configuração não têm propriedades específicas do MSBuild. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para especificar um limite rígido de heap de 200 mebibytes (MiB), os valores seriam 209715200 para o arquivo JSON e 0xC800000 ou C800000 para a variável de ambiente.
Percentagens de limite rígido por heap de objeto
Você pode especificar o limite rígido de heap do GC em uma base por heap de objeto. As diferentes pilhas são a pilha de objeto grande (LOH), a pilha de objeto pequeno (SOH) e a pilha de objeto fixo (POH).
- Se você especificar um valor para qualquer uma das
DOTNET_GCHeapHardLimitSOHPercent
configurações ,DOTNET_GCHeapHardLimitLOHPercent
, ouDOTNET_GCHeapHardLimitPOHPercent
, também deverá especificar um valor paraDOTNET_GCHeapHardLimitSOHPercent
eDOTNET_GCHeapHardLimitLOHPercent
. Se você não fizer isso, o tempo de execução falhará ao inicializar. - Essas configurações são ignoradas se
DOTNET_GCHeapHardLimitSOH
,DOTNET_GCHeapHardLimitLOH
eDOTNET_GCHeapHardLimitPOH
são especificadas. - Um valor de 1 significa que GC usa 1% da memória física total para esse heap de objeto.
- Cada valor deve ser maior que zero e menor que 100. Além disso, a soma dos três valores percentuais deve ser inferior a 100. Caso contrário, o tempo de execução falhará ao inicializar.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitSOHPercent |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitSOHPercent |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitSOHPercent |
valor hexadecimal | .NET 6 |
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitLOHPercent |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitLOHPercent |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitLOHPercent |
valor hexadecimal | .NET 6 |
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HeapHardLimitPOHPercent |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHeapHardLimitPOHPercent |
valor hexadecimal | .NET 5 |
Variável de ambiente | DOTNET_GCHeapHardLimitPOHPercent |
valor hexadecimal | .NET 6 |
Essas definições de configuração não têm propriedades específicas do MSBuild. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para limitar o uso de heap a 30%, os valores seriam 30 para o arquivo JSON e 0x1E ou 1E para a variável de ambiente.
Alta porcentagem de memória
A carga de memória é indicada pela percentagem de memória física em uso. Por padrão, quando a carga de memória física atinge 90%, a coleta de lixo se torna mais agressiva ao fazer coletas de lixo completas e compactadas para evitar a paginação. Quando a carga de memória está abaixo de 90%, o GC favorece as coletas em segundo plano para coletas de lixo completas, que têm pausas mais curtas, mas não reduzem muito o tamanho total da pilha. Em máquinas com uma quantidade significativa de memória (80GB ou mais), o limite de carga padrão está entre 90% e 97%.
O limite de alta carga de memória pode ser ajustado pela variável de ambiente ou System.GC.HighMemoryPercent
pela definição de DOTNET_GCHighMemPercent
configuração JSON. Considere ajustar o limite se quiser controlar o tamanho da pilha. Por exemplo, para o processo dominante em uma máquina com 64 GB de memória, é razoável que o GC comece a reagir quando há 10% de memória disponível. Mas para processos menores, por exemplo, um processo que consome apenas 1GB de memória, o GC pode ser executado confortavelmente com menos de 10% da memória disponível. Para esses processos menores, considere definir o limite mais alto. Por outro lado, se você quiser que processos maiores tenham tamanhos de heap menores (mesmo quando há muita memória física disponível), reduzir esse limite é uma maneira eficaz de o GC reagir mais cedo para compactar o heap para baixo.
Nota
Para processos executados em um contêiner, o GC considera a memória física com base no limite do contêiner.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.HighMemoryPercent |
valor decimal | .NET 5 |
Variável de ambiente | COMPlus_GCHighMemPercent |
valor hexadecimal | .NET Core 3.0 .NET Framework 4.7.2 |
Variável de ambiente | DOTNET_GCHighMemPercent |
valor hexadecimal | .NET 6 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para definir o limite de memória alta para 75%, os valores seriam 75 para o arquivo JSON e 0x4B ou 4B para a variável de ambiente.
Reter VM
- Configura se os segmentos que devem ser excluídos são colocados em uma lista de espera para uso futuro ou são liberados de volta para o sistema operacional (SO).
- Padrão: Liberar segmentos de volta para o sistema operacional. Isso equivale a definir o valor como
false
.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.RetainVM |
false - lançamento para SOtrue - colocar em standby |
.NET Core 1.0 |
Propriedade MSBuild | RetainVMGarbageCollection |
false - lançamento para SOtrue - colocar em standby |
.NET Core 1.0 |
Variável de ambiente | COMPlus_GCRetainVM |
0 - lançamento para SO1 - colocar em standby |
.NET Core 1.0 |
Variável de ambiente | DOTNET_GCRetainVM |
0 - lançamento para SO1 - colocar em standby |
.NET 6 |
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.RetainVM": true
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.RetainVM": true
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RetainVMGarbageCollection>true</RetainVMGarbageCollection>
</PropertyGroup>
</Project>
Páginas grandes
- Especifica se páginas grandes devem ser usadas quando um limite rígido de pilha é definido.
- Padrão: não use páginas grandes quando um limite rígido de pilha estiver definido. Isso equivale a definir o valor como
0
. - Este é um cenário experimental.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | N/A | N/D | N/A |
Variável de ambiente | COMPlus_GCLargePages |
0 - deficientes1 - ativado |
.NET Core 3.0 |
Variável de ambiente | DOTNET_GCLargePages |
0 - deficientes1 - ativado |
.NET 6 |
Permitir objetos grandes
- Configura o suporte ao coletor de lixo em plataformas de 64 bits para matrizes com mais de 2 gigabytes (GB) de tamanho total.
- Padrão: GC suporta matrizes maiores que 2 GB. Isso equivale a definir o valor como
1
. - Esta opção pode tornar-se obsoleta numa versão futura do .NET.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | N/A | N/D | N/A |
Variável de ambiente | COMPlus_gcAllowVeryLargeObjects |
1 - ativado0 - deficientes |
.NET Core 1.0 |
Variável de ambiente | DOTNET_gcAllowVeryLargeObjects |
1 - ativado0 - deficientes |
.NET 6 |
app.config para .NET Framework | gcAllowVeryLargeObjects | 1 - ativado0 - deficientes |
.NET Framework 4.5 |
Limite de heap de objeto grande
- Especifica o tamanho do limite, em bytes, que faz com que os objetos fiquem no heap de objeto grande (LOH).
- O limite padrão é de 85.000 bytes.
- O valor especificado deve ser maior do que o limite padrão.
- O valor pode ser limitado pelo tempo de execução ao tamanho máximo possível para a configuração atual. Você pode inspecionar o valor em uso em tempo de execução por meio da GC.GetConfigurationVariables() API.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.LOHThreshold |
valor decimal | .NET Core 1.0 |
Variável de ambiente | COMPlus_GCLOHThreshold |
valor hexadecimal | .NET Core 1.0 |
Variável de ambiente | DOTNET_GCLOHThreshold |
valor hexadecimal | .NET 6 |
app.config para .NET Framework | GCLOHThreshold | valor decimal | .NET Framework 4.8 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplos
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.GC.LOHThreshold": 120000
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.GC.LOHThreshold": 120000
}
}
Gorjeta
Se você estiver definindo a opção no runtimeconfig.json, especifique um valor decimal. Se você estiver definindo a opção como uma variável de ambiente, especifique um valor hexadecimal. Por exemplo, para definir um tamanho limite de 120.000 bytes, os valores seriam 120000 para o arquivo JSON e 0x1D4C0 ou 1D4C0 para a variável de ambiente.
GC independente
Para usar um coletor de lixo autônomo em vez da implementação padrão do GC, você pode especificar o caminho (no .NET 9 e versões posteriores) ou o nome de uma biblioteca nativa do GC.
Caminho
- Especifica o caminho completo de uma biblioteca nativa do GC que o tempo de execução carrega no lugar da implementação padrão do GC. Para ser seguro, este local deve ser protegido contra adulterações potencialmente maliciosas.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.Path |
string_path | .NET 9 |
Variável de ambiente | DOTNET_GCPath |
string_path | .NET 9 |
Nome
Especifica o nome de uma biblioteca nativa do GC que o tempo de execução carrega no lugar da implementação padrão do GC. O comportamento mudou no .NET 9 com a introdução da configuração Path .
No .NET 8 e versões anteriores:
- Se apenas um nome da biblioteca for especificado, a biblioteca deverá residir no mesmo diretório que o tempo de execução do .NET (coreclr.dll no Windows, libcoreclr.so no Linux ou libcoreclr.dylib no OSX).
- O valor também pode ser um caminho relativo, por exemplo, se você especificar ".. \clrgc.dll" no Windows, clrgc.dll é carregado do diretório pai do diretório de tempo de execução do .NET.
No .NET 9 e versões posteriores, esse valor especifica apenas um nome de arquivo (caminhos não são permitidos):
- O .NET procura o nome especificado no diretório onde reside o assembly que contém o método do
Main
seu aplicativo. - Se o arquivo não for encontrado, o diretório de tempo de execução do .NET será pesquisado.
Essa definição de configuração será ignorada se a configuração Path for especificada.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.Name |
string_name | .NET 7 |
Variável de ambiente | COMPlus_GCName |
string_name | .NET Core 2.0 |
Variável de ambiente | DOTNET_GCName |
string_name | .NET 6 |
Conservar memória
- Configura o coletor de lixo para conservar a memória às custas de coletas de lixo mais frequentes e, possivelmente, tempos de pausa mais longos.
- O valor padrão é 0 - isso implica nenhuma alteração.
- Além do valor padrão 0, valores entre 1 e 9 (inclusive) são válidos. Quanto maior o valor, mais o coletor de lixo tenta conservar a memória e, assim, manter a pilha pequena.
- Se o valor for diferente de zero, a pilha de objeto grande será compactada automaticamente se tiver muita fragmentação.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
runtimeconfig.json | System.GC.ConserveMemory |
0 - 9 |
.NET 6 |
Variável de ambiente | COMPlus_GCConserveMemory |
0 -9 |
.NET Framework 4.8 |
Variável de ambiente | DOTNET_GCConserveMemory |
0 -9 |
.NET 6 |
app.config para .NET Framework | GCConserveMemory | 0 -9 |
.NET Framework 4.8 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.
Exemplo de arquivo app.config :
<configuration>
<runtime>
<GCConserveMemory enabled="5"/>
</runtime>
</configuration>
Gorjeta
Experimente números diferentes para ver qual valor funciona melhor para você. Comece com um valor entre 5 e 7.
Adaptação dinâmica aos tamanhos das aplicações (DATAS)
- Configura o coletor de lixo para usar DATAS. DATA se adapta aos requisitos de memória do aplicativo, o que significa que o tamanho da pilha do aplicativo deve ser aproximadamente proporcional ao tamanho dos dados de longa duração.
- Habilitado por padrão a partir do .NET 9.
Nome da definição | Valores | Versão introduzida | |
---|---|---|---|
Variável de ambiente | DOTNET_GCDynamicAdaptationMode |
1 - ativado0 - deficientes |
.NET 8 |
Propriedade MSBuild | GarbageCollectionAdaptationMode |
1 - ativado0 - deficientes |
.NET 8 |
runtimeconfig.json | System.GC.DynamicAdaptationMode |
1 - ativado0 - deficientes |
.NET 8 |
Esta definição de configuração não tem uma propriedade MSBuild específica. No entanto, você pode adicionar um RuntimeHostConfigurationOption
item MSBuild em vez disso. Use o nome da configuração runtimeconfig.json como o valor do Include
atributo. Para obter um exemplo, consulte Propriedades do MSBuild.