Bagikan melalui


Opsi konfigurasi runtime bahasa umum untuk pengumpulan sampah

Halaman ini berisi informasi tentang pengaturan untuk pengumpul sampah (GC) runtime .NET. Jika Anda mencoba mencapai performa tertinggi dari aplikasi yang sedang berjalan, pertimbangkan untuk menggunakan pengaturan ini. Namun, pengaturan default memberikan performa optimal untuk sebagian besar aplikasi dalam situasi umum.

Pengaturan diatur ke dalam grup di halaman ini. Pengaturan dalam setiap grup biasanya digunakan bersama satu sama lain untuk mencapai hasil tertentu.

Catatan

  • Konfigurasi ini hanya dibaca oleh runtime ketika GC diinisialisasi (biasanya ini berarti selama waktu mulai proses). Jika Anda mengubah variabel lingkungan saat proses sudah berjalan, perubahan tidak akan tercermin dalam proses tersebut. Pengaturan yang dapat diubah melalui API pada waktu proses, seperti tingkat latensi, dihilangkan dari halaman ini.
  • Karena GC adalah per proses, jarang masuk akal untuk mengatur konfigurasi ini di tingkat komputer. Misalnya, Anda tidak ingin setiap proses .NET pada komputer menggunakan server GC atau batas keras timbunan yang sama.
  • Untuk nilai angka, gunakan notasi desimal untuk pengaturan dalam file runtimeconfig.json atau runtimeconfig.template.json dan notasi heksadesimal untuk pengaturan variabel lingkungan. Untuk nilai heksadesimal, Anda dapat menentukannya dengan atau tanpa awalan "0x".
  • Jika Anda menggunakan variabel lingkungan, .NET 6 dan versi yang lebih baru menstandarkan pada awalan DOTNET_ COMPlus_, bukan . Namun, prefiks COMPlus_ akan terus berfungsi. Jika Anda menggunakan versi .NET runtime sebelumnya, Anda harus tetap menggunakan awalan COMPlus_, misalnya, COMPlus_gcServer.

Cara untuk menentukan konfigurasi

Untuk versi yang berbeda dari runtime .NET, ada beberapa cara berbeda untuk menentukan nilai konfigurasi. Tabel berikut menunjukkan ringkasannya.

Lokasi konfigurasi Versi .NET lokasi ini berlaku untuk Format Bagaimana hal tersebut ditafsirkan
file runtimeconfig.json/
file runtimeconfig.template.json
.NET (Core) n n diinterpretasikan sebagai nilai desimal.
Variabel lingkungan .NET Framework, .NET (Core) 0xn atau n n ditafsirkan sebagai nilai heksadesimal dalam format apa pun
file config aplikasi .NET Framework 0xn n ditafsirkan sebagai nilai heksadesimal1

1 Anda dapat menentukan nilai tanpa awalan 0x untuk pengaturan file app.config, namun hal ini tidak disarankan. Pada .NET Framework 4.8+, karena bug, nilai yang ditentukan tanpa awalan 0x ditafsirkan sebagai heksadesimal, tetapi pada versi .NET Framework sebelumnya, nilai tersebut ditafsirkan sebagai desimal. Untuk menghindari keharusan mengubah konfigurasi Anda, gunakan awalan 0x saat menentukan nilai di file app.config Anda.

Misalnya, untuk menentukan 12 tumpukan GCHeapCount untuk aplikasi .NET Framework bernama A.exe, tambahkan XML berikut ke file A.exe.config.

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

Untuk .NET (Core) dan .NET Framework, Anda dapat menggunakan variabel lingkungan.

Pada Windows menggunakan .NET 6 atau versi yang lebih baru:

SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c

Pada Windows menggunakan .NET 5 atau yang lebih lama:

SET COMPlus_gcServer=1
SET COMPlus_GCHeapCount=c

Pada sistem operasi lain:

Untuk .NET 6 atau versi yang lebih baru:

export DOTNET_gcServer=1
export DOTNET_GCHeapCount=c

Untuk .NET 5 dan versi yang lebih lama:

export COMPlus_gcServer=1
export COMPlus_GCHeapCount=c

Jika Anda tidak menggunakan .NET Framework, Anda juga dapat mengatur nilai dalam file runtimeconfig.json atau runtimeconfig.template.json .

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Rasa pengumpulan sampah

Dua rasa utama dari pengumpulan sampah adalah GC stasiun kerja dan GC server. Untuk informasi selengkapnya tentang perbedaan di antara keduanya, lihat Pengumpulan sampah stasiun kerja dan server.

Subrasa dari pengumpulan sampah adalah latar belakang dan tidak bersamaan.

Gunakan pengaturan berikut untuk memilih ragam pengumpulan sampah:

Stasiun kerja vs. server

  • Mengonfigurasi apakah aplikasi menggunakan pengumpulan sampah stasiun kerja atau pengumpulan sampah server.
  • Default: Pengumpulan sampah stasiun kerja. Ini sama dengan mengatur nilai ke false.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.Server false - stasiun kerja
true - server
.NET Core 1.0
Properti MSBuild ServerGarbageCollection false - stasiun kerja
true - server
.NET Core 1.0
Variabel lingkungan COMPlus_gcServer 0 - stasiun kerja
1 - server
.NET Core 1.0
Variabel lingkungan DOTNET_gcServer 0 - stasiun kerja
1 - server
.NET 6
app.config untuk .NET Framework GCServer false - stasiun kerja
true - server

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

File proyek:

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

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

</Project>

Pengumpulan sampah latar belakang

  • Mengonfigurasi apakah pengumpulan sampah latar belakang (bersamaan) diaktifkan.
  • Default: Gunakan GC latar belakang. Ini sama dengan mengatur nilai ke true.
  • Untuk informasi selengkapnya, lihat Pengumpulan sampah di latar belakang.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.Concurrent true - GC latar belakang
false - GC tidak bersamaan
.NET Core 1.0
Properti MSBuild ConcurrentGarbageCollection true - GC latar belakang
false - GC tidak bersamaan
.NET Core 1.0
Variabel lingkungan COMPlus_gcConcurrent 1 - GC latar belakang
0 - GC tidak bersamaan
.NET Core 1.0
Variabel lingkungan DOTNET_gcConcurrent 1 - GC latar belakang
0 - GC tidak bersamaan
.NET 6
app.config untuk .NET Framework gcConcurrent true - GC latar belakang
false - GC tidak bersamaan

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

File proyek:

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

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

</Project>

Mengelola penggunaan sumber daya

Gunakan pengaturan berikut untuk mengelola memori pengumpul sampah dan penggunaan prosesor:

Untuk informasi selengkapnya tentang beberapa pengaturan ini, lihat entri blog Jalan tengah antara GC stasiun kerja dan server.

Jumlah tumpukan

  • Membatasi jumlah tumpukan yang dibuat oleh pengumpul sampah.
  • Hanya berlaku untuk pengumpulan sampah server.
  • Jika Afinitas prosesor GC diaktifkan, yang merupakan pengaturan defaultnya, pengaturan jumlah tumpukan mengafinitaskan ntumpukan/utas GC ke prosesor n pertama. (Gunakan pengaturan afinitaskan mask atau afinitaskan rentang untuk menentukan dengan tepat prosesor mana yang akan diafinitaskan.)
  • Jika Afinitas prosesor GC dinonaktifkan, pengaturan ini membatasi jumlah tumpukan GC.
  • Untuk informasi selengkapnya, lihat keterangan GCHeapCount.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapCount nilai desimal .NET Core 3.0
Variabel lingkungan COMPlus_GCHeapCount nilai heksadesimal .NET Core 3.0
Variabel lingkungan DOTNET_GCHeapCount nilai heksadesimal .NET 6
app.config untuk .NET Framework GCHeapCount nilai desimal .NET Framework 4.6.2

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk membatasi jumlah tumpukan hingga 16, nilainya adalah 16 untuk file JSON dan 0x10 atau 10 untuk variabel lingkungan.

Mengafinitaskan mask

  • Menentukan prosesor yang tepat yang harus digunakan oleh thread pengumpul sampah.
  • Jika Afinitas prosesor GC dinonaktifkan, pengaturan ini akan diabaikan.
  • Hanya berlaku untuk pengumpulan sampah server.
  • Nilainya adalah mask bit yang mendefinisikan prosesor yang tersedia untuk proses. Misalnya, nilai desimal 1023 (atau nilai heksadesimal 0x3FF atau 3FF jika Anda menggunakan variabel lingkungan) adalah 0011 1111 1111 dalam notasi biner. Ini menentukan bahwa 10 prosesor pertama yang akan digunakan. Untuk menentukan 10 prosesor berikutnya, yaitu prosesor 10-19, tentukan nilai desimal 1047552 (atau nilai heksadesimal 0xFFC00 atau FFC00), yang setara dengan nilai biner 1111 1111 1100 0000 0000.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapAffinitizeMask nilai desimal .NET Core 3.0
Variabel lingkungan COMPlus_GCHeapAffinitizeMask nilai heksadesimal .NET Core 3.0
Variabel lingkungan DOTNET_GCHeapAffinitizeMask nilai heksadesimal .NET 6
app.config untuk .NET Framework GCHeapAffinitizeMask nilai desimal .NET Framework 4.6.2

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Mengafinitaskan rentang

  • Menentukan daftar prosesor yang akan digunakan untuk thread pengumpul sampah.
  • Pengaturan ini mirip dengan System.GC.HeapAffinitizeMask, kecuali memungkinkan Anda menentukan lebih dari 64 prosesor.
  • Untuk sistem operasi Windows, awali nomor atau rentang prosesor dengan grup CPU yang sesuai, misalnya, "0:1-10,0:12,1:50-52,1:7". Jika Anda tidak benar-benar memiliki lebih dari 1 grup CPU, Anda tidak dapat menggunakan pengaturan ini. Anda harus menggunakan pengaturan Affinitize mask . Dan angka yang Anda tentukan berada dalam grup tersebut, yang berarti tidak boleh >= 64.
  • Untuk sistem operasi Linux, di mana konsep grup CPU tidak ada, Anda dapat menggunakan pengaturan ini dan pengaturan Affinitize mask untuk menentukan rentang yang sama. Dan alih-alih "0:1-10", tentukan "1-10" karena Anda tidak perlu menentukan indeks grup.
  • Jika Afinitas prosesor GC dinonaktifkan, pengaturan ini akan diabaikan.
  • Hanya berlaku untuk pengumpulan sampah server.
  • Untuk informasi selengkapnya, lihat Membuat konfigurasi CPU lebih baik untuk GC pada mesin dengan >64 CPU di blog Maoni Stephens.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapAffinitizeRanges Daftar nomor prosesor atau rentang nomor prosesor yang dipisahkan koma.
Contoh Unix: "1-10,12,50-52,70"
Contoh Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Variabel lingkungan COMPlus_GCHeapAffinitizeRanges Daftar nomor prosesor atau rentang nomor prosesor yang dipisahkan koma.
Contoh Unix: "1-10,12,50-52,70"
Contoh Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Variabel lingkungan DOTNET_GCHeapAffinitizeRanges Daftar nomor prosesor atau rentang nomor prosesor yang dipisahkan koma.
Contoh Unix: "1-10,12,50-52,70"
Contoh Windows: "0:1-10,0:12,1:50-52,1:7"
.NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Grup CPU

  • Mengonfigurasi apakah pengumpul sampah menggunakan grup CPU atau tidak.

    Ketika komputer Windows 64-bit memiliki beberapa grup CPU, yaitu, ada lebih dari 64 prosesor, elemen ini dapat memperluas pengumpulan sampah di semua grup CPU. Pengumpul sampah menggunakan semua inti untuk membuat dan menyeimbangkan tumpukan.

    Catatan

    Ini adalah konsep khusus Windows. Di versi Windows yang lebih lama, Windows membatasi proses ke satu grup CPU. Dengan demikian, GC hanya menggunakan satu grup CPU kecuali Anda menggunakan pengaturan ini untuk mengaktifkan beberapa grup CPU. Batasan OS ini dicabut pada Windows 11 dan Server 2022. Selain itu, mulai dari .NET 7, GC secara default menggunakan semua grup CPU saat berjalan pada Windows 11 atau Server 2022.

  • Berlaku hanya untuk pengumpulan sampah server pada sistem operasi Windows 64-bit.

  • Default: GC tidak meluas ke seluruh grup CPU. Ini sama dengan mengatur nilai ke 0.

  • Untuk informasi selengkapnya, lihat Membuat konfigurasi CPU lebih baik untuk GC pada mesin dengan >64 CPU di blog Maoni Stephens.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.CpuGroup false - dinonaktifkan
true - diaktifkan
.NET 5
Variabel lingkungan COMPlus_GCCpuGroup 0 - dinonaktifkan
1 - diaktifkan
.NET Core 1.0
Variabel lingkungan DOTNET_GCCpuGroup 0 - dinonaktifkan
1 - diaktifkan
.NET 6
app.config untuk .NET Framework GCCpuGroup false - dinonaktifkan
true - diaktifkan

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Catatan

Untuk mengonfigurasi runtime bahasa umum (CLR) agar juga mendistribusikan utas dari kumpulan utas di semua grup CPU, aktifkan opsi elemen Thread_UseAllCpuGroups. Untuk aplikasi .NET Core, Anda dapat mengaktifkan opsi ini dengan mengatur nilai variabel lingkungan DOTNET_Thread_UseAllCpuGroups ke 1.

Mengafinitaskan

  • Menentukan apakah akan mengafinitaskan utas pengumpulan sampah dengan prosesor. Untuk mengafinitaskan utas GC berarti hanya dapat berjalan pada CPU spesifiknya. Tumpukan dibuat untuk setiap utas GC.
  • Hanya berlaku untuk pengumpulan sampah server.
  • Default: Mengafinitaskan utas pengumpulan sampah dengan prosesor. Ini sama dengan mengatur nilai ke false.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.NoAffinitize false - afinitaskan
true - jangan diafinitaskan
.NET Core 3.0
Variabel lingkungan COMPlus_GCNoAffinitize 0 - afinitaskan
1 - jangan diafinitaskan
.NET Core 3.0
Variabel lingkungan DOTNET_GCNoAffinitize 0 - afinitaskan
1 - jangan diafinitaskan
.NET 6
app.config untuk .NET Framework GCNoAffinitize false - afinitaskan
true - jangan diafinitaskan
.NET Framework 4.6.2

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Batas keras tumpuk

  • Batas keras tumpukan didefinisikan sebagai ukuran penerapan maksimum, dalam byte, untuk tumpukan GC dan pembukuan GC.
  • Pengaturan ini hanya berlaku untuk komputer 64-bit.
  • Jika batas ini tidak dikonfigurasi tetapi proses berjalan di lingkungan yang dibatasi memori, yaitu, di dalam kontainer dengan batas memori tertentu, nilai default diatur. Default tersebut adalah lebih besar dari 20 MB atau 75% dari batas memori pada kontainer.
  • Pengaturan ini diabaikan jika batas keras Per-object-heap dikonfigurasi.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimit nilai desimal .NET Core 3.0
Variabel lingkungan COMPlus_GCHeapHardLimit nilai heksadesimal .NET Core 3.0
Variabel lingkungan DOTNET_GCHeapHardLimit nilai heksadesimal .NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk menentukan batas keras tumpukan 200 mebibytes (MiB), nilainya akan menjadi 209715200 untuk file JSON dan 0xC800000 atau C800000 untuk variabel lingkungan.

Persentase batas keras timbunan

  • Menentukan batas keras timbunan sebagai persentase dari total memori fisik. Jika proses berjalan di lingkungan yang dibatasi memori, yaitu, di dalam kontainer dengan batas memori yang ditentukan, total memori fisik adalah batas memori; jika tidak, itu adalah apa yang tersedia di komputer.
  • Pengaturan ini hanya berlaku untuk komputer 64-bit.
  • Pengaturan ini diabaikan jika batas keras Per-object-heap dikonfigurasi atau batas keras timbunan dikonfigurasi.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitPercent nilai desimal .NET Core 3.0
Variabel lingkungan COMPlus_GCHeapHardLimitPercent nilai heksadesimal .NET Core 3.0
Variabel lingkungan DOTNET_GCHeapHardLimitPercent nilai heksadesimal .NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk membatasi penggunaan tumpukan hingga 30%, nilainya adalah 30 untuk file JSON dan 0x1E atau 1E untuk variabel lingkungan.

Batas keras tumpukan per objek

Anda dapat menentukan batas keras tumpukan GC berdasarkan tumpukan per objek. Tumpukan yang berbeda adalah tumpukan objek besar (LOH), tumpukan objek kecil (SOH), dan tumpukan objek yang disematkan (POH).

  • Jika Anda menetapkan nilai untuk salah satu pengaturan DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH, atau DOTNET_GCHeapHardLimitPOH, Anda juga harus menentukan nilai untuk DOTNET_GCHeapHardLimitSOH dan DOTNET_GCHeapHardLimitLOH. Jika tidak, runtime akan gagal diinisialisasi.
  • Nilai default untuk DOTNET_GCHeapHardLimitPOH adalah 0. DOTNET_GCHeapHardLimitSOH dan DOTNET_GCHeapHardLimitLOH tidak memiliki nilai default.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitSOH nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitSOH nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitSOH nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitLOH nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitLOH nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitLOH nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitPOH nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitPOH nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitPOH nilai heksadesimal .NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk menentukan batas keras tumpukan 200 mebibytes (MiB), nilainya akan menjadi 209715200 untuk file JSON dan 0xC800000 atau C800000 untuk variabel lingkungan.

Persentase batas keras tumpuk per objek

Anda dapat menentukan batas keras tumpukan GC berdasarkan tumpukan per objek. Tumpukan yang berbeda adalah tumpukan objek besar (LOH), tumpukan objek kecil (SOH), dan tumpukan objek yang disematkan (POH).

  • Jika Anda menetapkan nilai untuk salah satu pengaturan DOTNET_GCHeapHardLimitSOHPercent, DOTNET_GCHeapHardLimitLOHPercent, atau DOTNET_GCHeapHardLimitPOHPercent, Anda juga harus menentukan nilai untuk DOTNET_GCHeapHardLimitSOHPercent dan DOTNET_GCHeapHardLimitLOHPercent. Jika tidak, runtime akan gagal diinisialisasi.
  • Pengaturan ini diabaikan jika DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH, dan DOTNET_GCHeapHardLimitPOH ditentukan.
  • Nilai 1 berarti GC menggunakan 1% dari total memori fisik untuk tumpukan objek tersebut.
  • Setiap nilai harus lebih besar dari nol dan kurang dari 100. Selain itu, jumlah dari tiga nilai persentase harus kurang dari 100. Jika tidak, runtime akan gagal diinisialisasi.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitSOHPercent nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitSOHPercent nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitSOHPercent nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitLOHPercent nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitLOHPercent nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitLOHPercent nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitPOHPercent nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHeapHardLimitPOHPercent nilai heksadesimal .NET 5
Variabel lingkungan DOTNET_GCHeapHardLimitPOHPercent nilai heksadesimal .NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk membatasi penggunaan tumpukan hingga 30%, nilainya adalah 30 untuk file JSON dan 0x1E atau 1E untuk variabel lingkungan.

Persentase memori tinggi

Beban memori ditunjukkan dengan persentase memori fisik yang digunakan. Secara default, saat beban memori fisik mencapai 90%, pengumpulan sampah menjadi lebih agresif dalam melakukan pengumpulan sampah secara penuh dan memadatkan untuk menghindari penomoran halaman. Saat beban memori di bawah 90%, GC mendukung pengumpulan latar belakang untuk pengumpulan sampah penuh, yang memiliki jeda lebih pendek tetapi tidak mengurangi ukuran tumpukan total terlalu banyak. Pada mesin dengan jumlah memori yang signifikan (80GB atau lebih), ambang beban defaultnya adalah antara 90% dan 97%.

Ambang beban memori yang tinggi dapat disesuaikan dengan variabel lingkungan DOTNET_GCHighMemPercent atau pengaturan konfigurasi JSON System.GC.HighMemoryPercent. Pertimbangkan untuk menyesuaikan ambang batas jika Anda ingin mengontrol ukuran tumpukan. Misalnya, untuk proses yang dominan pada mesin dengan memori 64GB, GC masuk akal untuk mulai bereaksi ketika ada 10% memori yang tersedia. Tetapi untuk proses yang lebih kecil, misalnya, proses yang hanya menghabiskan memori 1GB, GC dapat berjalan dengan nyaman dengan kurang dari 10% memori yang tersedia. Untuk proses yang lebih kecil ini, pertimbangkan untuk menetapkan ambang batas yang lebih tinggi. Di sisi lain, jika Anda ingin proses yang lebih besar memiliki ukuran heap yang lebih kecil (bahkan ketika ada banyak memori fisik yang tersedia), menurunkan ambang batas ini adalah cara yang efektif bagi GC untuk bereaksi lebih cepat untuk memadatkan tumpukan ke bawah.

Catatan

Untuk proses yang berjalan dalam kontainer, GC mempertimbangkan memori fisik berdasarkan batas kontainer.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HighMemoryPercent nilai desimal .NET 5
Variabel lingkungan COMPlus_GCHighMemPercent nilai heksadesimal .NET Core 3.0
.NET Framework 4.7.2
Variabel lingkungan DOTNET_GCHighMemPercent nilai heksadesimal .NET 6

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk mengatur ambang batas memori tinggi ke 75%, nilainya adalah 75 untuk file JSON dan 0x4B atau 4B untuk variabel lingkungan.

Mempertahankan VM

  • Mengonfigurasi apakah segmen yang harus dihapus dimasukkan ke dalam daftar siaga untuk digunakan di masa mendatang atau dilepaskan kembali ke sistem operasi (OS).
  • Default: Melepaskan segmen kembali ke sistem operasi. Ini sama dengan mengatur nilai ke false.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.RetainVM false - rilis ke OS
true - tetapkan ke mode siaga
.NET Core 1.0
Properti MSBuild RetainVMGarbageCollection false - rilis ke OS
true - tetapkan ke mode siaga
.NET Core 1.0
Variabel lingkungan COMPlus_GCRetainVM 0 - rilis ke OS
1 - tetapkan ke mode siaga
.NET Core 1.0
Variabel lingkungan DOTNET_GCRetainVM 0 - rilis ke OS
1 - tetapkan ke mode siaga
.NET 6

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

File proyek:

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

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

</Project>

Halaman besar

  • Menentukan apakah halaman besar harus digunakan saat batas keras tumpukan ditetapkan.
  • Default: Jangan gunakan halaman besar saat batas keras tumpukan ditetapkan. Ini sama dengan mengatur nilai ke 0.
  • Ini adalah pengaturan eksperimental.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json T/A T/A T/A
Variabel lingkungan COMPlus_GCLargePages 0 - dinonaktifkan
1 - diaktifkan
.NET Core 3.0
Variabel lingkungan DOTNET_GCLargePages 0 - dinonaktifkan
1 - diaktifkan
.NET 6

Mengizinkan objek besar

  • Mengonfigurasi dukungan pengumpul sampah pada platform 64-bit untuk array yang lebih besar dari 2 gigabyte (GB) dalam ukuran total.
  • Default: GC mendukung array yang lebih besar dari 2 GB. Ini sama dengan mengatur nilai ke 1.
  • Opsi ini mungkin tidak digunakan lagi di versi .NET yang akan datang.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json T/A T/A T/A
Variabel lingkungan COMPlus_gcAllowVeryLargeObjects 1 - diaktifkan
0 - dinonaktifkan
.NET Core 1.0
Variabel lingkungan DOTNET_gcAllowVeryLargeObjects 1 - diaktifkan
0 - dinonaktifkan
.NET 6
app.config untuk .NET Framework gcAllowVeryLargeObjects 1 - diaktifkan
0 - dinonaktifkan
.NET Framework 4.5

Ambang tumpukan objek besar

  • Menentukan ukuran ambang, dalam byte, yang menyebabkan objek masuk ke tumpukan objek besar (LOH).
  • Ambang defaultnya adalah 85.000 byte.
  • Nilai yang Anda tentukan harus lebih besar dari ambang default.
  • Nilai mungkin dibatasi oleh runtime hingga ukuran maksimum yang mungkin untuk konfigurasi saat ini. Anda dapat memeriksa nilai yang digunakan pada waktu proses melalui GC.GetConfigurationVariables() API.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.LOHThreshold nilai desimal .NET Core 1.0
Variabel lingkungan COMPlus_GCLOHThreshold nilai heksadesimal .NET Core 1.0
Variabel lingkungan DOTNET_GCLOHThreshold nilai heksadesimal .NET 6
app.config untuk .NET Framework GCLOHThreshold nilai desimal .NET Framework 4.8

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json:

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

Tip

Jika Anda mengatur opsi di runtimeconfig.json, tentukan nilai desimal. Jika Anda mengatur opsi sebagai variabel lingkungan, tentukan nilai heksadesimal. Misalnya, untuk menetapkan ukuran ambang 120.000 byte, nilainya akan menjadi 120000 untuk file JSON dan 0x1D4C0 atau 1D4C0 untuk variabel lingkungan.

GC mandiri

Untuk menggunakan pengumpul sampah mandiri alih-alih implementasi GC default, Anda dapat menentukan jalur (di .NET 9 dan versi yang lebih baru) atau nama pustaka asli GC.

Jalur

  • Menentukan jalur lengkap pustaka asli GC yang dimuat runtime sebagai pengganti implementasi GC default. Agar aman, lokasi ini harus dilindungi dari perusakan yang berpotensi berbahaya.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.Path string_path .NET 9
Variabel lingkungan DOTNET_GCPath string_path .NET 9

Nama

  • Menentukan nama pustaka asli GC yang dimuat runtime sebagai pengganti implementasi GC default. Perilaku berubah di .NET 9 dengan pengenalan konfigurasi Jalur .

    Di .NET 8 dan versi sebelumnya:

    • Jika hanya nama pustaka yang ditentukan, pustaka harus berada di direktori yang sama dengan runtime .NET (coreclr.dll di Windows, libcoreclr.so di Linux, atau libcoreclr.dylib di OSX).
    • Nilai juga dapat menjadi jalur relatif, misalnya, jika Anda menentukan ".. . \clrgc.dll" pada Windows, clrgc.dll dimuat dari direktori induk direktori runtime .NET.

    Di .NET 9 dan versi yang lebih baru, nilai ini hanya menentukan nama file (jalur tidak diizinkan):

    • .NET mencari nama yang Anda tentukan di direktori tempat assembly yang berisi metode aplikasi Main Anda berada.
    • Jika file tidak ditemukan, direktori runtime .NET akan dicari.
  • Pengaturan konfigurasi ini diabaikan jika konfigurasi Jalur ditentukan.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.Name string_name .NET 7
Variabel lingkungan COMPlus_GCName string_name .NET Core 2.0
Variabel lingkungan DOTNET_GCName string_name .NET 6

Menghemat memori

  • Mengonfigurasi pengumpul sampah untuk menghemat memori dengan mengorbankan pengumpulan sampah yang lebih sering dan mungkin waktu jeda yang lebih lama.
  • Nilai default adalah 0 - ini menyiratkan tidak ada perubahan.
  • Selain nilai default 0, nilai antara 1 dan 9 (inklusif) valid. Semakin tinggi nilainya, semakin banyak pengumpul sampah mencoba menghemat memori dan dengan demikian menjaga tumpukan tetap kecil.
  • Jika nilainya bukan nol, tumpukan objek besar akan dikompresi secara otomatis jika memiliki terlalu banyak fragmentasi.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.ConserveMemory 0 - 9 .NET 6
Variabel lingkungan COMPlus_GCConserveMemory 0 -9 .NET Framework 4.8
Variabel lingkungan DOTNET_GCConserveMemory 0 -9 .NET 6
app.config untuk .NET Framework GCConserveMemory 0 -9 .NET Framework 4.8

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.

Contoh file app.config:


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

Tip

Bereksperimenlah dengan angka yang berbeda untuk melihat nilai mana yang paling cocok untuk Anda. Mulailah dengan nilai antara 5 dan 7.

Adaptasi dinamis terhadap ukuran aplikasi (DATAS)

  • Mengonfigurasi pengumpul sampah untuk menggunakan DATAS. DATAS beradaptasi dengan persyaratan memori aplikasi, yang berarti ukuran timbunan aplikasi harus kira-kira sebanding dengan ukuran data berumur panjang.
  • Diaktifkan secara default mulai dari .NET 9.
Nama pengaturan Nilai Versi yang diperkenalkan
Variabel lingkungan DOTNET_GCDynamicAdaptationMode 1 - diaktifkan
0 - dinonaktifkan
.NET 8
Properti MSBuild GarbageCollectionAdaptationMode 1 - diaktifkan
0 - dinonaktifkan
.NET 8
runtimeconfig.json System.GC.DynamicAdaptationMode 1 - diaktifkan
0 - dinonaktifkan
.NET 8

Pengaturan konfigurasi ini tidak memiliki properti MSBuild tertentu. Namun, Anda dapat menambahkan RuntimeHostConfigurationOption item MSBuild sebagai gantinya. Gunakan nama pengaturan runtimeconfig.json sebagai nilai Include atribut . Misalnya, lihat properti MSBuild.