Skip to content

Instantly share code, notes, and snippets.

@l3ngli
Last active December 1, 2025 20:40
Show Gist options
  • Select an option

  • Save l3ngli/a9fa8b7dcaa3840c8e670088bbf55b87 to your computer and use it in GitHub Desktop.

Select an option

Save l3ngli/a9fa8b7dcaa3840c8e670088bbf55b87 to your computer and use it in GitHub Desktop.

Покращення збирача сміття в .NET 10: адаптивні механізми, стекові алокації та оптимізації компактації

Анотація

У версії .NET 10 відбулися суттєві вдосконалення в роботі збирача сміття (Garbage Collector, GC), спрямовані на підвищення продуктивності та покращення керування пам’яттю в сучасних високонавантажених середовищах. Найважливіші зміни стосуються розширеного escape analysis, що дає змогу переносити частину алокацій на стек, ввімкнення механізму DATAS за замовчуванням, удосконалення компактації та оптимізації великих об’єктів, а також покращень у JIT-компіляції, що зменшують приховані алокації. Стаття систематизує головні оновлення GC у .NET 10 та аналізує їхній вплив на ефективність виконання застосунків.

Ключові слова: .NET 10, Garbage Collector, GC, DATAS, стекові алокації, escape analysis, LOH, компактація, JIT


Вступ

Автоматичне керування пам’яттю - одна з центральних характеристик платформи .NET, яка безпосередньо впливає на продуктивність і стабільність застосунків. Останні кілька релізів .NET були орієнтовані на адаптивність, зниження накладних витрат та оптимізацію роботи у хмарних та контейнерних середовищах.

У .NET 9 важливим кроком стало впровадження механізму DATAS (Dynamic Adaptation To Application Sizes). У .NET 10 цей підхід поглиблено: адаптивні механізми працюють за замовчуванням, а разом з ними з’явилося кілька важливих внутрішніх оптимізацій GC і JIT.

Цей огляд систематизує ці покращення та пояснює їх значення для розробників.


1. Основи роботи збирача сміття в .NET

GC у .NET побудований на поколінній моделі:

  • Gen 0 - короткоживучі об’єкти
  • Gen 1 - середньоживучі
  • Gen 2 - довгоживучі
  • LOH (Large Object Heap) - великі об’єкти (> ~85 KB)

Таке розділення ґрунтується на статистичному принципі “більшість об’єктів помирає молодими”, що дозволяє ресурсно ефективно обробляти алокації.

Основні проблеми попередніх версій:

  • фрагментація LOH
  • надмірні короткоживучі алокації
  • високі пікові значення використання пам’яті
  • нестабільна поведінка у контейнерах при жорстких memory-limits

.NET 10 усуває частину цих недоліків за допомогою комбінованих GC- і JIT-оптимізацій.


2. Поглиблений escape analysis та стекові алокації

Одне з ключових оновлень .NET 10 - розширення можливостей escape analysis у JIT-компіляторі. Якщо об’єкт не виходить за межі методу або делегата, JIT може:

  • розмістити об’єкт у стеку, а не в heap
  • повністю усунути алокацію, якщо об’єкт використовується лише для проміжних обчислень

Переваги:

  • зниження тиску на Gen 0
  • менше GC-пауза
  • швидше виконання гарячих ділянок коду (hot-path)
  • менша фрагментація

Це особливо корисно для:

  • алгоритмічних методів
  • LINQ-ланцюгів
  • обчислень з інтенсивним створенням тимчасових масивів

3. DATAS увімкнено за замовчуванням

Механізм Dynamic Adaptation To Application Sizes (DATAS) відтепер працює за умовчанням. Він дозволяє GC адаптивно регулювати розмір heap залежно від реального робочого навантаження.

Переваги DATAS у .NET 10:

  • зменшення memory footprint під час низької активності
  • краща поведінка застосунків у контейнерах
  • контрольованіша траєкторія росту heap
  • швидше повернення невикористаної пам’яті

DATAS може збільшувати кількість невеликих колекцій, але загальна керованість пам’яттю покращується.


4. Покращена компактація та робота з великими об’єктами

Версія .NET 10 включає оптимізації, спрямовані на:

  • зменшення вартості компактації
  • зниження фрагментації у LOH
  • передбачуванішу поведінку GC-пауз

Особливо важливо для сценаріїв:

  • обробки великих масивів
  • роботи зі streaming-даними
  • високонавантажених серверних систем

Завдяки цьому, застосунки, що працюють з великими об’ємами даних, менш схильні до OOM-помилок і мають стабільнішу роботу з пам’яттю.


5. Оптимізації JIT і скорочення прихованих алокацій

У .NET 10 JIT-компілятор агресивніше усуває операції, які раніше створювали приховані об’єкти:

  • непотрібні делегати та лямбда-вирази
  • зайві closure
  • зайві ітератори, boxing/unboxing

Також покращено:

  • inline-розширення
  • де-віртуалізацію викликів
  • Write-barrier оптимізації - коли можна довести, що запис вказівки не потребує барʼєра, GC може пропустити зайві операції

У результаті:

  • менше об’єктів потрапляє в Gen 0
  • знижується загальна частота GC
  • підвищується стабільність latency

6. Практичні наслідки для розробників

  • Більшість оптимізацій працює автоматично - код змінювати не потрібно.
  • Інтенсивно використовувані методи отримують значний приріст швидкодії через зниження короткочасних алокацій.
  • Застосунки, що працюють з великими обсягами даних, зазнають меншої фрагментації LOH та рідших OOM-помилок.
  • У контейнерах на кшталт Docker поведінка GC стала стабільнішою завдяки DATAS.
  • Системи з жорсткими вимогами до latency можуть потребувати індивідуального тестування, щоб врахувати частоту дрібних GC-проходів у нових налаштуваннях.

Висновки

.NET 10 робить значний крок у напрямку ефективнішого управління пам’яттю. Поєднання розширеного escape analysis, адаптивного механізму DATAS, оптимізованої компактації та вдосконалених JIT-перетворень формує оновлену модель GC, орієнтовану на продуктивність, стабільність і прогнозовану поведінку в реальних середовищах розгортання.

Ці оновлення особливо важливі для серверних, контейнерних та високонавантажених застосунків, де керування пам’яттю є критичним фактором.


Список літератури

  1. What’s new in .NET 10 - Runtime. Microsoft Learn, 2025.
  2. Performance Improvements in .NET 10. .NET Blog (Microsoft DevBlogs), 2025.
  3. Garbage Collector & Memory Compaction Improvements in .NET 10. Steve Bang (blog), 2025.
  4. Object Stack Allocation in .NET 10: A Deep Dive into Escape Analysis. Amir Mokarchi, Medium, 2025.
  5. What .NET 10 GC Changes Mean for Developers. Roxeem, 2025.
  6. JIT: De-abstraction in .NET 10 - Issue #108913. dotnet/runtime GitHub, 2024.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment