Middle+
.NETте чоң объекттердин (Large Object Heap) жана кичинекей объекттердин (Small Object Heap) бөлүнүшү эмне үчүн керек?
sobes.tech AI
AIден жооп
LOH жана SOH топтолмолорун бөлүү эс тутумду башкарууну оптималдаштырат, ар кандай өлчөмдөгү объекттер үчүн.
Small Object Heap (SOH)
- 85 KB чейин объекттерди сактайт.
- Генерациондуу калдык чогултуучу (Generational Garbage Collection - GC) колдонулат.
- Жаңы түзүлгөн объекттер 0-генерацияда болот. Өлүп калган объекттер 1-генерацияга, андан кийин 2-генерацияга которулат.
- Калдык чогултуу көбүрөөк жана натыйжалуу кичинекей объекттер үчүн.
// SOHдө объект түзүү мисалы
string smallString = "Бул кичинекей сап"; // 85 KBден аз
object smallObject = new object(); // Кичинекей объект
Large Object Heap (LOH)
- 85 KB жана андан чоңураак объекттерди сактайт.
- Бул генерациондуу эмес, SOH сыяктуу. Адатта, толук калдык чогултуу (2-генерация) учурунда гана тазаланады.
- LOHдеги эс тутумду бөлүү ылдамыраак болушу мүмкүн, анткени үзгүлтүксүз бөлүктү издөө керек.
- LOH фрагментациясы чоң объекттерди бөлүүдө көйгөйлөрдү жаратышы мүмкүн, эгерде жалпы бош эс тутум жетиштүү болсо да.
- LOHдеги объекттер әдепки GC тарабынан которулбайт (с .NET Framework 4.5.1, LOHты кысуу мүмкүнчүлүгү бар, бирок ал алдын ала өчүрүлгөн жана өзүнүн чыгымдары бар). Бул чоң маалыматтардын кымбат көчүрүлүшүн алдын алат.
// LOHдө объект түзүү мисалы
byte[] largeArray = new byte[100 * 1024]; // 100 KB > 85 KB
Артыкчылыктары бөлүү
- Калдык чогултууну оптималдаштыруу: Генерациондуу GC кичинекей, кыска мөөнөттүү объекттер үчүн SOHта натыйжалуу. Объекттерди SOHка которуу салыштырмалуу тез.
- SOH фрагментациясын азайтуу: Үлкен объекттерди которуу өтө кымбат жана катуу фрагментацияга алып келиши мүмкүн. Алардын бөлөк LOH топтомуна жайгаштырылышы бул маселени чечет.
- Шығындарды минималдаштыруу: Үлкен объекттерди LOHка которуу маанилүү чыгымдарга алып келет. Алдын ала орнотулган GC аларды которбойт, бул чыгымдарды жокко чыгарат.
- Эс тутумдун бөлүштүрүү ылдамдыгын жакшыртуу: SOHда бөлүштүрүү көбүнчө абдан тез болот (көрсөткүч аркылуу), ал эми LOHда ылайыктуу бош блокту издөө керек болушу мүмкүн. Бөлүү бул ылдамдыкты сактоого мүмкүндүк берет.
| Өзгөчөлүк | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Объекттин өлчөмү | 85 KB чейин | 85 KB жана андан көп |
| GC модел | Генерациондуу (0, 1, 2) | Генерациондуу эмес (өз алдынча) |
| Объекттерди которуу | Ооба (жыймдоо) | Жок (өз алдынча) |
| Тазалоо жыштыгы | Көбүрөөк | Азырынча (көбүнчө 2-генерация менен) |
| Фрагментация коркунучу | Төмөн (жыймдоо) | Жогорку |