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, prefiksCOMPlus_
akan terus berfungsi. Jika Anda menggunakan versi .NET runtime sebelumnya, Anda harus tetap menggunakan awalanCOMPlus_
, 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 kerjatrue - server |
.NET Core 1.0 |
Properti MSBuild | ServerGarbageCollection |
false - stasiun kerjatrue - server |
.NET Core 1.0 |
Variabel lingkungan | COMPlus_gcServer |
0 - stasiun kerja1 - server |
.NET Core 1.0 |
Variabel lingkungan | DOTNET_gcServer |
0 - stasiun kerja1 - server |
.NET 6 |
app.config untuk .NET Framework | GCServer | false - stasiun kerjatrue - 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 belakangfalse - GC tidak bersamaan |
.NET Core 1.0 |
Properti MSBuild | ConcurrentGarbageCollection |
true - GC latar belakangfalse - GC tidak bersamaan |
.NET Core 1.0 |
Variabel lingkungan | COMPlus_gcConcurrent |
1 - GC latar belakang0 - GC tidak bersamaan |
.NET Core 1.0 |
Variabel lingkungan | DOTNET_gcConcurrent |
1 - GC latar belakang0 - GC tidak bersamaan |
.NET 6 |
app.config untuk .NET Framework | gcConcurrent | true - GC latar belakangfalse - 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:
- Mengafinitaskan
- Mengafinitaskan mask
- Mengafinitaskan rentang
- Grup CPU
- Jumlah tumpukan
- Batas keras tumpuk
- Persentase batas keras timbunan
- Batas keras tumpukan per objek
- Persentase batas keras tumpuk per objek
- Persentase memori tinggi
- Mempertahankan VM
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
n
tumpukan/utas GC ke prosesorn
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 - dinonaktifkantrue - diaktifkan |
.NET 5 |
Variabel lingkungan | COMPlus_GCCpuGroup |
0 - dinonaktifkan1 - diaktifkan |
.NET Core 1.0 |
Variabel lingkungan | DOTNET_GCCpuGroup |
0 - dinonaktifkan1 - diaktifkan |
.NET 6 |
app.config untuk .NET Framework | GCCpuGroup | false - dinonaktifkantrue - 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 - afinitaskantrue - jangan diafinitaskan |
.NET Core 3.0 |
Variabel lingkungan | COMPlus_GCNoAffinitize |
0 - afinitaskan1 - jangan diafinitaskan |
.NET Core 3.0 |
Variabel lingkungan | DOTNET_GCNoAffinitize |
0 - afinitaskan1 - jangan diafinitaskan |
.NET 6 |
app.config untuk .NET Framework | GCNoAffinitize | false - afinitaskantrue - 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
, atauDOTNET_GCHeapHardLimitPOH
, Anda juga harus menentukan nilai untukDOTNET_GCHeapHardLimitSOH
danDOTNET_GCHeapHardLimitLOH
. Jika tidak, runtime akan gagal diinisialisasi. - Nilai default untuk
DOTNET_GCHeapHardLimitPOH
adalah 0.DOTNET_GCHeapHardLimitSOH
danDOTNET_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
, atauDOTNET_GCHeapHardLimitPOHPercent
, Anda juga harus menentukan nilai untukDOTNET_GCHeapHardLimitSOHPercent
danDOTNET_GCHeapHardLimitLOHPercent
. Jika tidak, runtime akan gagal diinisialisasi. - Pengaturan ini diabaikan jika
DOTNET_GCHeapHardLimitSOH
,DOTNET_GCHeapHardLimitLOH
, danDOTNET_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 OStrue - tetapkan ke mode siaga |
.NET Core 1.0 |
Properti MSBuild | RetainVMGarbageCollection |
false - rilis ke OStrue - tetapkan ke mode siaga |
.NET Core 1.0 |
Variabel lingkungan | COMPlus_GCRetainVM |
0 - rilis ke OS1 - tetapkan ke mode siaga |
.NET Core 1.0 |
Variabel lingkungan | DOTNET_GCRetainVM |
0 - rilis ke OS1 - 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 - dinonaktifkan1 - diaktifkan |
.NET Core 3.0 |
Variabel lingkungan | DOTNET_GCLargePages |
0 - dinonaktifkan1 - 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 - diaktifkan0 - dinonaktifkan |
.NET Core 1.0 |
Variabel lingkungan | DOTNET_gcAllowVeryLargeObjects |
1 - diaktifkan0 - dinonaktifkan |
.NET 6 |
app.config untuk .NET Framework | gcAllowVeryLargeObjects | 1 - diaktifkan0 - 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 - diaktifkan0 - dinonaktifkan |
.NET 8 |
Properti MSBuild | GarbageCollectionAdaptationMode |
1 - diaktifkan0 - dinonaktifkan |
.NET 8 |
runtimeconfig.json | System.GC.DynamicAdaptationMode |
1 - diaktifkan0 - 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.