Middle+
Ինչու է անհրաժեշտ բաժանել մեծ օբյեկտների heap-ը (Large Object Heap) և փոքր օբյեկտների heap-ը (Small Object Heap) .NET-ում?
sobes.tech AI
Պատասխան AI-ից
LOH և SOH հողակտորների բաժանումը օպտիմալացնում է հիշողության կառավարումը տարբեր չափերի օբյեկտների համար:
Small Object Heap (SOH)
- Պահպանում է մինչև 85 ԿԲ չափով օբյեկտներ:
- Օգտագործում է սերնդային աղբահավաք (Generational Garbage Collection - GC):
- Վերջին ժամանակներում ստեղծված օբյեկտները գտնվում են 0-րդ սերնդում: Զինված օբյեկտները տեղափոխվում են 1-ին, ապա 2-րդ սերնդ:
- Աղբահավաքը հաճախ է և ավելի արդյունավետ փոքր օբյեկտների համար:
// Օրինակ SOH-ում օբյեկտ ստեղծելու
string smallString = "Սա փոքր տող է"; // Ավելի քիչ, քան 85 ԿԲ
object smallObject = new object(); // Փոքր օբյեկտ
Large Object Heap (LOH)
- Պահպանում է 85 ԿԲ և ավելի մեծ օբյեկտներ:
- Չի հանդիսանում սերնդային, ինչպես SOH. Սովորաբար մաքրվում է միայն ամբողջական աղբահավաքի ժամանակ (2-րդ սերունդ):
- Հիշողության հատկացմանը LOH-ում կարող է տևել ավելի երկար, քանի որ որոնում է շարունակական հիշողության բլոկ:
- LOH-ի ֆրագմենտացիան կարող է առաջացնել մեծ օբյեկտների հատկացման խնդիրներ, նույնիսկ եթե ընդհանուր ազատ հիշողությունը բավարար է:
- LOH-ի օբյեկտները ըստ նախնական կարգավորումների չեն տեղափոխվում GC-ի կողմից (с .NET Framework 4.5.1 հնարավոր է սեղմել LOH-ը, բայց դա անջատված է ըստ նախնական կարգավորումների և ունի իր ծախսերը): Սա կանխում է մեծ տվյալների թանկարժեք պատճենումը:
// Օրինակ LOH-ում օբյեկտ ստեղծելու
byte[] largeArray = new byte[100 * 1024]; // չափը 100 ԿԲ > 85 ԿԲ
Առավելություններ բաժանման
- Աղբահավաքի օպտիմալացում: Սերնդային GC-ը շատ ավելի արդյունավետ է փոքր, կարճաժամկետ օբյեկտների համար SOH-ում: Օբյեկտների տեղափոխումը SOH-ում արագ է:
- SOH-ի ֆրագմենտացիայի նվազեցում: Մեծ օբյեկտների տեղափոխումը շատ թանկ է և կարող է հանգեցնել ուժեղ ֆրագմենտացիայի: Դրանք առանձին LOH հողակտորում տեղադրելը լուծում է այդ խնդիրը:
- Ավելի քիչ ծախսեր: Մեծ օբյեկտների տեղափոխումը LOH-ում մեծ ծախսեր է առաջացնում: Նախնական GC-ը դրանք չի տեղափոխում, ինչը խուսափում է այդ ծախսերից:
- Հիշողության հատկացման արագության բարելավում: SOH-ում հատկացումը հաճախ շատ արագ է (նշանակատուի միջոցով), մինչդեռ LOH-ում անհրաժեշտ է որոնել համապատասխան ազատ բլոկ:
| Գծագրություն | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Օբյեկտի չափը | Մինչև 85 ԿԲ | 85 ԿԲ և ավելի |
| GC մոդելը | Սերնդային (0, 1, 2 սերունդներ) | Չի սերնդային (առանցքային) |
| Օբյեկտների տեղափոխում | Այո (սեղմում) | Ոչ (առանցքային) |
| Մաքրման հաճախականությունը | Ավելի հաճախ | Փոքր հաճախականությամբ (հաճախ 2-րդ սերնդով) |
| Ֆրագմենտացիայի ռիսկը | Ներքև (սեղմում) | Բարձր |