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 saat runtime, 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, awalan COMPlus_ 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 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 sistem operasi lain menggunakan .NET 6 atau versi yang lebih baru:

export DOTNET_gcServer=1
export DOTNET_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 -peladen
.NET Core 1.0
Properti MSBuild ServerGarbageCollection false - stasiun kerja
true -peladen
.NET Core 1.0
Variabel lingkungan DOTNET_gcServer 0 - stasiun kerja
1 -peladen
.NET 6
app.config untuk .NET Framework GCServer false - stasiun kerja
true -peladen

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 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>

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 DOTNET_GCName string_name .NET 6

Pengaturan khusus LOH

Izinkan objek yang sangat 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 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 runtime melalui GC.GetConfigurationVariables() API.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.LOHThreshold nilai desimal .NET Core 3.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
   }
}

Petunjuk / Saran

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.

Mengelola penggunaan sumber daya untuk semua ragam GC

Pengaturan berikut berlaku untuk semua ragam GC:

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 berjalan di lingkungan yang dibatasi memori (misalnya, kontainer) dan nilai ini tidak diatur, nilai defaultnya adalah 20 MB atau persentase batas keras tumpukan dari batas kontainer, mana yang lebih besar.
  • 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 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
   }
}

Petunjuk / Saran

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 dalam lingkungan dengan batas memori yang ditetapkan (misalnya, kontainer), batas tersebut diperlakukan sebagai total memori fisik. Di lingkungan seperti itu, nilai defaultnya adalah 75%.
  • 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 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
   }
}

Petunjuk / Saran

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 DOTNET_GCHeapHardLimitSOH nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitLOH nilai desimal .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 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.

Petunjuk / Saran

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 DOTNET_GCHeapHardLimitSOHPercent nilai heksadesimal .NET 6
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.HeapHardLimitLOHPercent nilai desimal .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 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.

Petunjuk / Saran

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.

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 DOTNET_GCLargePages 0 - dinonaktifkan
1 - diaktifkan
.NET 6

Rentang wilayah

Mulai dari .NET 7, tumpukan GC mengalihkan representasi fisiknya dari segmen ke wilayah untuk Windows dan Linux 64-bit. (Untuk informasi selengkapnya, lihat artikel blog Maoni Stephens.) Dengan perubahan ini, GC mencadangkan berbagai memori virtual selama inisialisasi. Perhatikan bahwa ini hanya mempertahankan memori, tidak melakukan (ukuran tumpukan GC adalah memori yang diterapkan). Ini hanyalah rentang untuk menentukan rentang maksimum yang dapat diterapkan tumpukan GC. Sebagian besar aplikasi tidak perlu berkomitmen hampir sebanyak ini.

Jika Anda tidak memiliki konfigurasi lain dan tidak berjalan di lingkungan yang dibatasi memori (yang akan menyebabkan beberapa konfigurasi GC diatur), secara default 256 GB dicadangkan. Jika Anda memiliki lebih dari 256 GB memori fisik yang tersedia, jumlahnya akan dua kali lipat.

Jika batas keras per timbunan ditetapkan, rentang cadangan sama dengan batas keras total. Jika konfigurasi batas keras tunggal diatur, rentang ini adalah lima kali jumlah tersebut.

Rentang ini dibatasi oleh jumlah total memori virtual. Biasanya pada 64-bit ini tidak pernah menjadi masalah, tetapi mungkin ada batas memori virtual yang ditetapkan pada proses. Rentang ini dibatasi oleh setengah jumlah tersebut. Misalnya, jika Anda mengatur HeapHardLimit konfigurasi ke 1 GB dan memiliki batas memori virtual 4 GB yang ditetapkan pada proses, rentang ini adalah min (5x1GB, 4GB/2), yaitu 2 GB.

Anda dapat menggunakan GC.GetConfigurationVariables() API untuk melihat nilai rentang ini dengan nama GCRegionRange. Jika Anda mendapatkan E_OUTOFMEMORY selama inisialisasi runtime dan ingin melihat apakah itu karena mempertahankan rentang ini, lihat VirtualAlloc panggilan dengan MEM_RESERVE di Windows, atau mmap panggilan dengan PROT_NONE di Linux, selama inisialisasi GC dan lihat apakah OOM berasal dari panggilan itu. Jika panggilan cadangan ini gagal, Anda dapat mengubahnya melalui pengaturan konfigurasi berikut. Rekomendasi untuk jumlah reservasi adalah dua hingga lima kali ukuran yang diterapkan untuk tumpukan GC Anda. Jika skenario Anda tidak membuat banyak alokasi besar (ini bisa menjadi alokasi apa pun pada UOH atau lebih besar dari ukuran wilayah UOH), dua kali ukuran penerapan harus aman. Jika tidak, Anda mungkin ingin membuatnya lebih besar sehingga Anda tidak dikenakan GC yang terlalu sering dikompresi penuh untuk membuat ruang untuk wilayah yang lebih besar tersebut. Jika Anda tidak mengetahui ukuran penerapan tumpukan GC, Anda dapat mengatur ini ke dua kali jumlah memori fisik yang tersedia untuk proses Anda.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.RegionRange nilai desimal .NET 10
Variabel lingkungan DOTNET_GCRegionRange nilai heksadesimal .NET 7

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.

Ukuran wilayah

Dimulai dengan .NET 7, tumpukan GC mengalihkan representasi fisiknya dari segmen ke wilayah untuk Windows dan Linux 64-bit. (Untuk informasi selengkapnya, lihat artikel blog Maoni Stephens.) Secara default, setiap wilayah adalah 4 MB untuk SOH. Untuk UOH (LOH dan POH), ukuran wilayah SOH delapan kali lipat. Anda dapat menggunakan konfigurasi ini untuk mengubah ukuran wilayah SOH, dan wilayah UOH akan disesuaikan.

Wilayah hanya dialokasikan jika diperlukan, jadi secara umum Anda tidak perlu khawatir tentang ukuran wilayah. Namun, ada dua kasus di mana Anda mungkin ingin menyesuaikan ukuran ini:

  • Untuk proses yang memiliki tumpukan GC yang sangat kecil, mengubah ukuran wilayah menjadi lebih kecil bermanfaat untuk penggunaan memori asli dari pembukuan GC sendiri. Rekomendasinya adalah 1 MB.
  • Di Linux, jika Anda perlu mengurangi jumlah pemetaan memori, Anda dapat mengubah ukuran wilayah menjadi lebih besar, misalnya, 32 MB.
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.RegionSize nilai desimal .NET 10
Variabel lingkungan DOTNET_GCRegionSize nilai heksadesimal .NET 7

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.

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 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.

Petunjuk / Saran

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 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>

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 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>

Petunjuk / Saran

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

Mengelola penggunaan sumber daya untuk Server GC

Pengaturan berikut memengaruhi jumlah utas GC Server dan jika/bagaimana alur tersebut diafinisiskan ke inti. Mereka tidak berpengaruh pada Workstation GC.

Untuk informasi selengkapnya tentang pengaturan 3 pertama, lihat entri blog Middle ground antara stasiun kerja dan server GC .

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 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
   }
}

Petunjuk / Saran

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

  • 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 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
   }
}

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 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 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 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.

Adaptasi dinamis terhadap ukuran aplikasi (DATAS)

Mengaktifkan atau menonaktifkan 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

Target TCP

DATAS menggunakan Throughput Cost Percentage (TCP) sebagai pengukuran biaya memori pada throughput. Hal ini mempertimbangkan jeda GC dan berapa banyak alokasi yang harus ditunda. Biasanya, jeda GC mendominasi, sehingga Anda dapat menggunakan "% waktu jeda di GC" untuk mempertanyakan biaya ini. Ada dua kasus sementara di mana waktu tunggu alokasi dapat mendominasi:

  • Saat proses dimulai, DATAS selalu dimulai dengan satu timbunan. Jadi jika ada cukup utas yang mengalokasikan, mereka mengalami penantian.
  • Ketika beban kerja berubah dari lebih ringan ke lebih berat, misalnya, ketika jam sibuk dimulai, mengalokasikan utas mungkin mengalami penantian selama periode waktu tersebut. Itu karena dibutuhkan beberapa GC sebelum jumlah timbunan meningkat.

DATAS menggunakan 2% sebagai TCP default, yang dapat Anda sesuaikan dengan pengaturan ini. Ini adalah bilangan bulat yang ditafsirkan sebagai persentase, misalnya, 5 berarti TCP target akan menjadi 5%.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.GC.DTargetTCP nilai desimal .NET 9
Variabel lingkungan DOTNET_GCDTargetTCP nilai heksadesimal .NET 9

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.

Pengaturan anggaran maks Gen0

Menyesuaikan anggaran gen0 adalah salah satu elemen utama yang digunakan DATAS untuk beradaptasi dengan ukuran aplikasi. DATAS mendefinisikan ambang batas atas yang disebut BCD (Anggaran Dihitung melalui DATAS) untuk total anggaran gen0 sebagai fungsi dari ukuran aplikasi. Rumus untuk menghitung pengali adalah sebagai berikut:

$$ f(\text{application_size_in_MB}) = \frac{20 - \text{conserve_memory}}{\sqrt{\text{application_size_in_MB}}} $$

Rumus kemudian dijepit oleh nilai maksimum dan minimum sebelum diterapkan ke ukuran aplikasi dalam MB. Jika pengaturan menghemat memori tidak ditentukan, DATAS menggunakan 5 secara default. Nilai maksimum dan minimum masing-masing adalah 10 dan 0,1.

Misalnya, jika ukuran aplikasi adalah 1 GB, rumus menghitung (20 - 5) / sqrt (1000) = 0.474. Karena antara 10 dan 0,1, penjepitan tidak berpengaruh. Ini berarti total anggaran gen0 adalah 47,4% 1 GB yaitu 474 MB. Jika ukuran aplikasi adalah 1 MB, rumus akan menghitung 15 yang kemudian akan disesuaikan menjadi 10, yang berarti total anggaran gen0 yang diizinkan adalah 10 MB.

Tiga pengaturan disediakan untuk menyesuaikan apa yang dihitung rumus dan mengubah nilai penjepitan:

  • Persentase yang akan diterapkan pada hitungan apa f .

    Nama pengaturan Nilai Versi yang diperkenalkan
    runtimeconfig.json System.GC.DGen0GrowthPercent nilai desimal .NET 10
    Variabel lingkungan DOTNET_GCDGen0GrowthPercent nilai heksadesimal .NET 10

    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.

    Jadi jika f menghitung 0,474 dan pengaturan ini adalah 200, pengali menjadi 0.474 * 200% = 0.948 sebelum penjepitan diterapkan.

  • Nilai penjepitan maksimum dalam permil.

    Nama pengaturan Nilai Versi yang diperkenalkan
    runtimeconfig.json System.GC.DGen0GrowthMaxFactor nilai desimal .NET 10
    Variabel lingkungan DOTNET_GCDGen0GrowthMaxFactor nilai heksadesimal .NET 10

    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.

    Jika nilai ini adalah 20000, itu berarti nilai penjepitan maksimum adalah 20000 * 0.001 = 20.

  • Nilai penjepitan minimum dalam permil.

    Nama pengaturan Nilai Versi yang diperkenalkan
    runtimeconfig.json System.GC.DGen0GrowthMinFactor nilai desimal .NET 10
    Variabel lingkungan DOTNET_GCDGen0GrowthMinFactor nilai heksadesimal .NET 10

    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.

    Jika nilai ini adalah 200, nilai penjepitan minimum adalah 200 * 0.001 = 0.2.