What is Garbage Collection in .NET Framework?
ูู
ุง ุฃู ุงุจูููุดู dot net ุจูุดุชุบูุ ุจูุชุนู
ู objects ูุชูุฑ ุฌุฏูุง ูู ุงูู
ูู
ูุฑู. ููู ููุช ู
ุนููุ ู
ู
ูู ุงูุชุทุจูู ุจุชุงุนู ู
ููููุด ุจูุณุชุฎุฏู
ุจุนุถ ุงูู objects ุฏู. ููุง ุจูุฌู ุฏูุฑ ุงูู Garbage Collector ูู .NET Frameworkุ ููู ุนุจุงุฑุฉ ุนู ุฑูุชูู ุตุบูุฑุ ุฃู ููุฏุฑ ูููู ุฅูู Background Process Thread ุจูุดุชุบู ุจุดูู ุฏูุฑู ุนุดุงู ูุญุงูู ูุญุฏุฏ ุฅูู ูู ุงูู objects ุงููู ู
ุด ู
ุณุชุฎุฏู
ุฉ ุญุงูููุง ู
ู ุฎูุงู ุงูุชุทุจููุ ูุจุนุฏูู ุจูุจุฏุฃ ูุญุฑุฑ ุงูุฐุงูุฑุฉ ุงูุฎุงุตุฉ ุจุงูู objects ุฏู ูููุถููุง.
ุฅุฐูุ ุงูู Garbage Collector ูู ู
ูุฒุฉ ู
ูู
ุฉ ุจููุฏู
ูุง ุงูู CLR ุนุดุงู ุชุณุงุนุฏูุง ููุถู ุฃู ูุฏู
ุฑ ุงูู managed objects ุบูุฑ ุงูู
ุณุชุฎุฏู
ุฉ. ุนู
ููุฉ ุชูุธูู ุงูู objects ุฏู ุจุชุฑุฌุนููุง ุงูู
ุณุงุญุฉ ุงููู ูุงูุช ูุงุฎุฏูุง ูู ุงูุฐุงูุฑุฉ ุนุดุงู ููุฏุฑ ูุณุชุฎุฏู
ูุง ุชุงูู.
ุงูู Garbage Collection (GC) ูู .NET Framework ุจูุนุชุจุฑ ูุธุงู
ุฅุฏุงุฑุฉ ุงูู
ูู
ูุฑู ุชููุงุฆู (Automatic Memory Management)ุจูุณุงุนุฏู ุชููุฏู ุญูุงุฑ ุงูู
ูู
ูุฑู ูู ุชุทุจููุงุชู.
ูู ูุบุงุช .NETุ ูู
ุง ุจูุนู
ู object ุฌุฏูุฏ ุจุงุณุชุฎุฏุงู
ููู
ุฉ newุ ุจูุชู
ุชุฎุตูุต ู
ุณุงุญุฉ ููู ูู ุงูู
ูู
ูุฑู ุชููุงุฆููุง ุนูู ุงูู managed heap. ูุจุงูุชุงููุ ุฅูุช ู
ุด ู
ุญุชุงุฌ ุชุฎุตุต ุฃู ุชุญุฑุฑ ุงูุฐุงูุฑุฉ ุจููุณู ุจุดูู ูุฏูู ุฒู ู
ุง ุจุชุนู
ู ูู ูุบุงุช ุชุงููุฉ ุฒู C ุฃู C++.
ู ูุญูุธุฉ: ุงูู
Garbage Collectorุจูุฏู ุฑ ุจุณ ุงููmanaged objectsุบูุฑ ุงูู ุณุชุฎุฏู ุฉุ ูููู ู ุด ุจููุถู ุงููunmanaged objects.
Managed and Unmanaged Objects in .NET Framework
ุฎูููุง ูููู
ุฅูู ูู
ุง ุงูู Managed objects ูุงูู Unmanaged objects.
ูู
ุง ุจูุนู
ู ุฃู ู
ูู EXE (ุณูุงุก ูุงู Console Application ุฃู Windows Application) ุฃู Web Application (ุฒู ASP.NET MVC ุฃู Web API)ุ ุงูุชุทุจููุงุช ุฏู ุจุชุดุชุบู ุจุงููุงู
ู ุชุญุช ุณูุทุฑุฉ ูุชุญูู
ุงูู CLR (Common Language Runtime). ุฏู ู
ุนูุงู ุฅู ูู ุชุทุจููุงุชู ูููุง objects ุบูุฑ ู
ุณุชุฎุฏู
ุฉุ ุงูู CLR ูููุถููุง ุชููุงุฆููุง ุจุงุณุชุฎุฏุงู
ุงูู Garbage Collector.
ูููุชุฑุถ ุฅูู ุงุณุชุฎุฏู
ุช ู
ูู EXE ู
ู ุทุฑู ุชุงูุช (third-party) ูู ุชุทุจูููุ ุฒู ุจุฑูุงู
ุฌ Skypeุ PowerPointุ ุฃู Microsoft Excel. ุงูู EXEs ุฏู ู
ุด ู
ุนู
ููุฉ ุจุชูููููุฌูุง dot netุ ุฏู ู
ุนู
ููุฉ ุจูุบุงุช ุจุฑู
ุฌุฉ ุชุงููุฉ ุฒู Cุ C++ุ ุฃู Java.
ูู
ุง ุจุชุณุชุฎุฏู
ุงูู EXEs ุฏู ูู ุชุทุจูููุ ูู ู
ุด ุจุชุดุชุบู ุชุญุช ุฅุฏุงุฑุฉ ุงูู CLR. ุญุชู ูู ุดุบูุชูุง ุฌูู ุชุทุจููุงุช dot netุ ูู ูุชุดุชุบู ุชุญุช ุจูุฆุชูุง ุงูุฎุงุตุฉ ุจููุง. ูุนูู ู
ุซูุงูุ ูู ุงูู EXE ุฏู ู
ุนู
ูู ุจู C ุฃู C++ุ ููุดุชุบู ุชุญุช ุงูู C ุฃู C++ Runtime Environment.
- ุงูู Managed Code: ูู ุงูููุฏ ุงููู ุจูุดุชุบู ุชุญุช ุชุญูู
ูุงู
ู ู
ู ุงูู
CLRูู .NET Framework. ุงููCLRุจูููุฑ ูู ุงูู ู ูุฒุงุช ุจุชุงุนุชู ูููmanaged codeุฒู ุงููLanguage Interoperabilityุ ุงููAutomatic Memory Managementุ ุงููException Handlingุ ูุงููCode Access Security. - ุงูู Unmanaged Code: ูู ุงูููุฏ ุงููู ู
ุด ุจูุดุชุบู ุชุญุช ุชุญูู
ุงูู
CLRุ ุฒู ุจุฑุงู ุฌSkypeูExcel. ูุจุงูุชุงููุ ุงููCLRู ุด ุจูููุฑ ุฃู ู ูุฒุฉ ู ู ู ู ูุฒุงุชู ููููุฏ ุฏู.
Managed Objects
- ูู ุนุจุงุฑุฉ ุนู
objectsุจุชุชุนู ู ุนูู ุงููmanaged heapูุจูุชุญูู ูููุง ุงููGarbage Collector (GC)ุจุชุงุน ุจูุฆุฉ .NET. - ุงูู
GCูู ุงูู ุณุคูู ุนู ุฅุฏุงุฑุฉ Memory ุจุชุงุนุชูุง ุชููุงุฆููุง. - ุฃู
ุซูุฉ ุนูููุง: ุฃู
instanceู ูclassุฃูstructุจุชุนู ูู ุจุงุณุชุฎุฏุงู ููู ุฉnewููC#ุฃูVB.NETุ ุฃู ุงููobjectsุงูุฃุณุงุณูุฉ ุฒู ุงููarraysูุงููstrings.
Unmanaged Objects
- ูู ุนุจุงุฑุฉ ุนู
objectsุงูุฐุงูุฑุฉ ุจุชุงุนุชูุง ู ุด ุจุชุฏุงุฑ ุจูุงุณุทุฉ ุงููGC. - ุฏู ูู ุงูุนุงุฏุฉ ุจุชููู
objectsุจุชุชุนู ู ุจููุฏ ุฃุตูู (native code)ุ ุฒู ุงุณุชุฏุนุงุกุงุช ุงููWindows APIุฃู ุนู ุทุฑูู ุงุณุชุฎุฏุงู ูุบุงุช ุฒูCุฃูC++. - ุงูู
ุจุฑู
ุฌ ููุง ูู ุงูู
ุณุคูู ุนู ุญูุงุฑ ุงูู
ูู
ูุฑู ุจุชุงุนุชูุง ุจููุณู ุจุงุณุชุฎุฏุงู
APIsู ุนููุฉ ุฒูmallocูfreeูู ูุบุฉCุฃูnewูdeleteูู ูุบุฉC++. - ุฃู
ุซูุฉ ุนูููุง: ุงูู
file handlesุ ุงุชุตุงูุงุช DBุ ูุงููCOM objects.
Garbage Collection Memory Generations
ุฎูููุง ูููู
ุฅูู ูู ุฃุฌูุงู ุงูู Garbage Collector ูุฅุฒุงู ุจุชุฃุซุฑ ุนูู ุงูุฃุฏุงุก ุจุชุงุนู. ุงูู GC ู
ุชูุณู
ูุชูุงุช ุฃุฌูุงู: ุงูู Generation 0ุ ุงูู Generation 1ุ ูุงูู Generation 2.
Understanding Generation 0, 1, and 2
ูููุชุฑุถ ุฅู ุนูุฏู ุชุทุจูู ุจุณูุท ุงุณู
ู App1. ุจู
ุฌุฑุฏ ู
ุง ุงูุชุทุจูู ุฏู ูุจุฏุฃ ูุดุชุบูุ ุจูุนู
ู 5 ู
ู ุงูู managed objects. ูู ุงูุนุงุฏูุ ูู ู
ุง ูุชู
ุฅูุดุงุก objects ุฌุฏูุฏุฉุ ุจุชุชุญุท ูู โุฌุฑุฏูโ (Bucket) ุงุณู
ู Generation 0.
graph TD subgraph Heap subgraph "Generation 0" direction LR O1(Object1) O2(Object2) O3(Object3) O4(Object4) O5(Object5) end end A[New Objects] --> O1
ุฅุญูุง ุนุงุฑููู ุฅู ุงูู Garbage Collector ุจูุดุชุบู ุจุงุณุชู
ุฑุงุฑ ูู ุงูุฎูููุฉ ุนุดุงู ูุดูู ููุดูู ูู ููู ุฃู objects ุบูุฑ ู
ุณุชุฎุฏู
ุฉ. ูููุชุฑุถ ุฅู ุงูุชุทุจูู ุจุชุงุนูุง ู
ุจูุงุด ู
ุญุชุงุฌ Object1 ู Object2. ุงูู GC ููุฏู
ุฑูู
ููุฑุฌุน ุงูู
ุณุงุญุฉ ุจุชุงุนุชูู
ููู
ูู
ูุฑู ู
ู ุงูู Generation 0. ููู ู
ู ูุงุญูุฉ ุชุงููุฉุ ุงูุชุทุจูู ูุณู ู
ุญุชุงุฌ ุจุงูู ุงูุชูุงุชุฉ objects. ุงูู GC ู
ุด ูููุถููู
ุ ูุจุฏููุง ู
ู ูุฏู ููููููู
ููุฌูู ุงููู ุจุนุฏู ููู ุงูู Generation 1.
graph TD subgraph Heap subgraph "Generation 0" G0["Empty"] end subgraph "Generation 1" direction LR O3(Object3) O4(Object4) O5(Object5) end end X(๐๏ธ Garbage) O1[Object1] -- Destroyed --> X O2[Object2] -- Destroyed --> X subgraph Survivors direction LR S3(Object3) S4(Object4) S5(Object5) end S3 -- Promoted --> O3 S4 -- Promoted --> O4 S5 -- Promoted --> O5
ูููุชุฑุถ ุฏูููุชู ุฅู ุชุทุจููู ุนู
ู ุงุชููู objects ุฌุฏุงุฏ (Object6 ู Object7). ุจู
ุง ุฅููู
objects ูุณู ุฌุฏุงุฏุ ููุชุญุทูุง ู
ุจุงุดุฑุฉ ูู ุงูู Generation 0.
ุฏูููุชูุ ุงูู GC ููุดุชุบู ู
ุฑุฉ ุชุงููุฉุ ูุจูุฑูุญ ุฃูู ุญุงุฌุฉ ููู Generation 0 ููุดูู ุฅูู ุงูู objects ุงูู
ุณุชุฎุฏู
ุฉ. ูููุชุฑุถ ุฅู ุงูุงุชููู ุงูุฌุฏุงุฏ ู
ุด ู
ุณุชุฎุฏู
ููุ ูููู
ุณุญูู
. ุจุนุฏูู ูุฑูุญ ููู Generation 1 ููุดูู ุฅูู ุงููู ู
ุด ู
ุณุชุฎุฏู
ููุงู. ูููุชุฑุถ ุฅู ุงูุชุทุจูู ูุณู ู
ุญุชุงุฌ Object4 ู Object5 ููู ู
ุจูุงุด ู
ุญุชุงุฌ Object3. ุงูู GC ููุฏู
ุฑ Object3 ููููู Object4 ู Object5 ููุฌูู ุงูุฃุฎูุฑ ุงููู ูู Generation 2.
Why do we need Generations?
ุงูุฃุฌูุงู ุฏู ุจุชุญุฏุฏ ู
ุฏุฉ ุจูุงุก ุงูู objects ูู ุงูุฐุงูุฑุฉ. ุทูุจ ููู ุจูุญุชุงุฌ ุงูุฃุฌูุงู ุฏู ุฃุตูุงูุ
ุงูุชุทุจููุงุช ุงููุจูุฑุฉ ู
ู
ูู ุชุนู
ู ุขูุงู ู
ู ุงูู objects. ูู ุงูู GC ูุถู ูุดูู ุนูููู
ูููู
ูู ูู ู
ุฑุฉ ุจูุดุชุบู ูููุงุ ุงูุนู
ููุฉ ุฏู ูุชุจูู ู
ุฑููุฉ ุฌุฏูุง ูุจุทูุฆุฉ. ุจุญูุงุฑ ุงูุฃุฌูุงู ุฏุงุ ูู ููู object ู
ูุฌูุฏ ูู ุงูู Generation 2ุ ุฏู ู
ุนูุงู ุฅู ุงูู GC ููุฒูุฑู ุนุฏุฏ ู
ุฑุงุช ุฃูู ุจูุชูุฑุ ูุฃู ุงูู object ุงููู ุจููุตู ููู
ุฑุญูุฉ ุฏู ูุจูู ู
ุชููุน ุฌุฏูุง ุฅูู ูููุถู ุนุงูุด ูู ุงูุฐุงูุฑุฉ ููุชุฑุฉ ุฃุทูู.
ุจุจุณุงุทุฉุ ุชูุณูู
ุงูุฐุงูุฑุฉ ูู Generations 0, 1, 2 ุจูุณุงุนุฏ ุฌุฏูุง ูู ุฒูุงุฏุฉ ุฃุฏุงุก ูุณุฑุนุฉ ุงูู Garbage Collector. ูู ู
ุง ูุงูุช ุฃุบูุจ ุงูู objects ุจุชุฎูุต ูู ุงูู Gen 0ุ ูู ู
ุง ูุงู ุงูุฃุฏุงุก ุฃุญุณู ูุงูุฐุงูุฑุฉ ุจุชุณุชุฎุฏู
ุจุดูู ู
ุซุงูู.
How does using a Destructor in a Class end up in a Double Garbage Collector Loop?
ุฒู ู
ุง ูุถุญูุง ูุจู ูุฏูุ ุงูู GC ุจููุถู ุงูู managed code ุจุณ. ูู ุนูุฏู ูู ู
ุดุฑูุนู unmanaged codeุ ูุงุฒู
ุชููุฑ ุทุฑููุฉ ุชูุถูู ุจููุง ุจููุณู. ูุงูู
ูุงู ุงูู
ูุทูู ุงููู ู
ู
ูู ุชููุฑ ุชุญุท ููู ููุฏ ุงูุชูุถูู ุฏู ูู ุงูู destructor ุจุชุงุน ุงูู class. ููู ููุฃุณูุ ููู ู
ุดููุฉ ูุจูุฑุฉ ุฌุฏูุง ู
ุฑุชุจุทุฉ ุจุงูู
ูุถูุน ุฏู.
ูู
ุง ุจุชุนุฑู destructor ูู ุงูู class ุจุชุงุนูุ ุงูู GC ูุจู ู
ุง ูุฏู
ุฑ ุงูู object ุฏูุ ุจูุฑูุญ ูุณุฃู ุงูู class: ูู ุนูุฏู destructorุ ูู ุงูุฅุฌุงุจุฉ ุฃููุฉุ ุจูููู ุงูู object ุฏู ููุฌูู ุงููู ุจุนุฏู (next generation bucket). ุจู
ุนูู ุชุงููุ ู
ุด ุจููุถูู ูู ุณุงุนุชูุงุ ุญุชู ูู ูู ูุนูููุง ู
ุด ู
ุณุชุฎุฏู
. ุงูู GC ุจูุณุชูู ุงูู destructor ูุดุชุบู ุงูุฃููุ ูุจุนุฏูู ูู Loop ุงููู ุจุนุฏูุง ูุฑูุญ ููุถูู. ุจุณุจุจ ุงูููุฉ ุฏูุ ูุชูุงูู objects ุฃูุชุฑ ุจุชุชุฑุงูู
ูู ุงูู Generation 1 ูุงูู Generation 2 ุจุฏู ู
ุง ุชุชูุถู ูู ุงูู Generation 0ุ ูุฏู ุจูุฃุซุฑ ุจุดูู ุณูุจู ุนูู ุงูุฃุฏุงุก ูุงุณุชููุงู ุงูู
ูู
ูุฑู.
Example using Destructor to Destroy the Unmanaged Resources
ุจุต ุนูู ุงูููุฏ ุฏู. ุฏู ููุณ ุงูู
ุซุงู ุงููู ู
ู
ูู ูููู ุงุชููู
ูุง ุนููุ ุจุณ ุถููุง destructors ููู classes ุนุดุงู ูุดูู ุงูู
ุดููุฉ:
using System;
namespace GarbageCollectionDemo
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i <= 1000000; i++)
{
MyClass1 obj1 = new MyClass1();
MyClass2 obj2 = new MyClass2();
MyClass3 obj3 = new MyClass3();
}
Console.Read();
}
}
public class MyClass1
{
~MyClass1()
{
// Clean unmanaged resources here
}
}
// Similar for MyClass2 and MyClass3...
}ูู ุดุบูุช ุงูู
ุซุงู ุฏู ูุงุณุชุฎุฏู
ุช ุฃุฏุงุฉ ุฒู .NET Memory Profilerุ ูุชูุงุญุธ ุจูุถูุญ ุฅู ููู objects ูุชูุฑ ุฌุฏูุง ุงุชูููุช ูุจูุช ูู ุงูู Generation 1 ูุงูู Generation 2. ูุฏู ู
ุนูุงู ุฅูู ู
ุด ุจุชุณุชุบู ุงูุฐุงูุฑุฉ ุจุชุงุนุชู ุจุงูุดูู ุงูุตุญ.
How to Overcome the above Problem?
ุงูู
ุดููุฉ ุงููู ุงุชููู
ูุง ุนููุง ุฏู ุจุชุชุญู ุนู ุทุฑูู ุงุณุชุฎุฏุงู
(Pattern) ุงุณู
ู ุงูู Dispose Pattern. ุนุดุงู ุชุทุจู Pattern ุฏูุ ุงูู class ุจุชุงุนู ูุงุฒู
ูุทุจู ุงูู IDisposable interfaceุ ููููุฑ (Implementation) ููู Dispose method. ุฌูู ุงูู Dispose method ุฏูุ ุจุชูุชุจ ุงูููุฏ ุงูุฎุงุต ุจุชูุธูู ุงูู unmanaged objectsุ ููู ุขุฎุฑ ุงูู method ุจุชุณุชุฏุนู ุฏุงูุฉ GC.SuppressFinalize(true). ุงูุฏุงูุฉ ุฏู ุจุชุฏู ุฃู
ุฑ ูุชุจูุบ ุงูู GC ุฅูู ูุชุฌุงูู ุงูู destructor ุฎุงูุต ููุฑูุญ ููุถู ุงูู objects ุฏู ุนูู ุทูู ู
ู ุบูุฑ ู
ุง ูุณุชูู.
ุจุณ ุฎูู ุจุงููุ ุจุนุฏ ู
ุง ุชุฎูุต ุงุณุชุฎุฏุงู
ุงูู objectุ ูุงุฒู
ุชุณุชุฏุนู ุงูู Dispose method ุจููุณู ุฌูู ุงูููุฏ ุนุดุงู ุชุชุฌูุจ ู
ุดููุฉ ุงูู double garbage collector loop.
Example using Dispose Pattern to Destroy the Unmanaged Object in C#
using System;
namespace GarbageCollectionDemo
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i <= 1000000; i++)
{
MyClass1 obj1 = new MyClass1();
obj1.Dispose();
MyClass2 obj2 = new MyClass2();
obj2.Dispose();
MyClass3 obj3 = new MyClass3();
obj3.Dispose();
}
Console.Read();
}
}
public class MyClass1 : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // Detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// Clean managed objects
}
// Clean unmanaged objects
disposedValue = true;
}
}
~MyClass1()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
// Similar implementation for MyClass2 and MyClass3
}ูู ุฌุฑุจุช ุชุดุบู ุงูู
ุซุงู ุฏู ูุชุฑุงูุจู ุจุงูู profilerุ ูุชูุงุญุธ ุฅู ู
ุนุธู
ุงูู objects ูุชูุถู ูุชุชูุถู ูู ุงูู Generation 0ุ ูุฏู ุทุจุนูุง ุจูุญุณู ู
ู ุฃุฏุงุก ุชุทุจููู ุจุดูู ู
ูุญูุธ.
ุทูุจ ููุง ู
ู
ูู ุชุณุฃู: ููู ุงูู destructor ูุณู ู
ูุฌูุฏ ูู ุงูููุฏุ ุงูุณุจุจ ูู ุฅูู ุจูููู ู
ูุฌูุฏ ูููุน ู
ู ุฃููุงุน ุงูุถู
ุงู (Safety net). ูู ุฃูุช ูู Developer ูุณูุช ุชูุงุฏู ุงูู Dispose method ุจุฅูุฏูุ ุงูู destructor ููุดุชุบู ูู ุงูุขุฎุฑ ูููุถู ุงูู objectุ ูุฏู ุจูุญู
ูู ู
ู ุฅู ูุญุตู (Memory Leak).
Notes
Correction (ุชุตุญูุญ ููู)
- ุฏุงูุฉ GC.SuppressFinalize: ูุงุญูุง ุจููุงุฏู ุนูู
GC.SuppressFinalize()ุ ุงูู ูุซูุฏ ุฏู ู ุด ุจุชุงุฎุฏ ููู ุฉBooleanุ ุฏู ุจุชุงุฎุฏ ุงููobject referenceุ ูุนูู ุจุชุชูุชุจ ุจุงูุดูู ุฏู:GC.SuppressFinalize(this). - ุฏูุฑุฉ ุญูุงุฉ ุงูู Destructor: ุงููู ุจูุญุตู ุฅู ุงูู
GCูู ุง ุจููุงููobjectูููFinalizer(ุฃูDestructor) ูู ุจูุงุด ู ุณุชุฎุฏู ุ ุจููููู ูุทุงุจูุฑ ุงุณู ูF-Reachable Queue. ูุฌูุฏู ูู ุงูุทุงุจูุฑ ุฏู ุจูุฎููู ููุนุชุจุฑ (Alive) ุจุงููุณุจุฉ ูููGCุงูุญุงููุ ูุจุงูุชุงูู ุจููุฌู ู ู ุนู ููุฉ ุงูุชูุธูู ุงูุญุงููุฉ ูุจูุชุฑูู ุชููุงุฆููุง ููุฌูู ุงููู ุจุนุฏู. ุจุนุฏูู ุจูุฌูThreadู ุฎุตุต ูููFinalizerูููุฐ ููุฏ ุงูุชูุถููุ ููู ุฏูุฑุฉ ุงููGCุงููู ุจุนุฏูุง ุจูุชู ู ุณุญู ุฃุฎูุฑูุง. - ุงูู Managed Heap ูุงูู Stack: ู
ูู
ููุถุญ ุฅู ุงูู
Garbage Collectorุจูุดุชุบู ุฃุณุงุณูุง ุนูู ุงููManaged Heap(ุงูู ูุงู ุงููู ุจูุชุฎุฒู ููู ุงููReference Typesุฒู ุงููClasses). ุฃู ุง ุงููValue Types(ุฒู ุงููintู ุงููstructs) ูุบุงูุจุงู ุจุชุชุฎุฒู ุนูู ุงููStackุ ูุงููStackุจููุถู ููุณู ุจููุณู ุจู ุฌุฑุฏ ู ุง ุงููMethodุชุฎูุตุ ูู ุด ุจูุญุชุงุฌ ุชุฏุฎู ู ู ุงููGC. - ููู ุงูู Generation 0 ุณุฑูุนุ: ุงูู
Gen 0ุจูููู ู ุณุงุญุชู ุตุบูุฑุฉ ูุบุงูุจูุง ุจูููู ู ูุฌูุฏ ุฌูู ุงููCPU Cacheุ ูุนู ููุฉ ุชูุธููู ุจุชููู ุณุฑูุนุฉ ุฌุฏูุง ูู ุด ุจุชุฃุซุฑ ุนูู ุฃุฏุงุก ุงูุชุทุจูู.
ุงูู .NET 10 ุฌุงูุจ ู
ุนุงู ุชุญุณููุงุช ูููุฉ ุฌุฏูุง ุชุฎุต ุงูู Garbage Collector ุนุดุงู ูููู ุงูุถุบุท ุนููู ููุฒูุฏ ุงูุฃุฏุงุก:
- ุงูู Stack Allocation for Small Arrays: ูู
.NET 10ุ ุงููJITุจูู ุฃุฐููุ ูุจููุฏุฑ ูุญูู ุงูููุฏ (Escape Analysis). ูู ููู ุฅูู ุนุงู ูArrayุตุบูุฑ (ุณูุงุกValue TypeุฃูReference Type) ูู ุด ููุฎุฑุฌ ุจุฑู ุญุฏูุฏ ุงููMethodุงููู ุงุชุนู ู ูููุงุ ุจูุญุฌุฒู ุนูู ุงููStackุจุฏู ุงููHeap. ุฏู ุจูููู ุนุฏุฏ ุงููobjectsุงููู ุงููGCู ุญุชุงุฌ ูุฑุงูุจูุง ููู ุณุญูุง. - ุงูู DATAS (Dynamic Adaptation To Application Sizes): ุงููุธุงู
ุฏู ุจูู ู
ุชูุนู ุจุดูู ุชููุงุฆู ูู ู
ุนุธู
ุงูุฅุนุฏุงุฏุงุชุ ูุฏู ุจูุฎูู ุงูู
GCูุถุจุท ู ุณุงุญุงุช ุงูุฐุงูุฑุฉ ุจุดูู ุฏููุงู ููู ุญุณุจ ุงุญุชูุงุฌ ุงูุชุทุจูู ุงููุนููุ ู ู ุง ูููู ู ู ุงุณุชููุงู ุงูุฐุงูุฑุฉ ุจุดูู ูุจูุฑ. - ุชุญุณููุงุช ุงูู Write-Barrier (ุฎุงุตุฉ ูู
ุนุงูุฌุงุช Arm64): ุงูู
Write-Barrierูู ู ููุงููุฒู ุจูุณุชุฎุฏู ู ุงููGCุนุดุงู ูุชุชุจุน ููobjectูุฏูู (ูู ุฌูู ุฃูุจุฑ) ุดุงูุฑ ุนููobjectุฌุฏูุฏ. ูู.NET 10ุชู ุชุญุณูู ุงูู ููุงููุฒู ุฏู ูุชูููู ุงูุงุนุชู ุงุฏ ุนููู ูู ุจุนุถ ุงูุญุงูุงุชุ ูุฏู ุฃุฏู ูุชูููู ููุช ุงูุชููู (Pause Times) ุฃุซูุงุก ุนู ู ุงููGCุจูุณุจ ุจุชูุตู ูู 20%.