Middle+
Խոսեք աղբահանության հավաքողի (Garbage Collector) աշխատանքի մեթոդների մասին։
sobes.tech AI
Պատասխան AI-ից
Ջամփագծողը ավտոմատ կառավարման գործընթաց է հիշողության, որը ազատում է այն հիշողությունը, որը զբաղեցրած է օբյեկտներով, որոնք այլևս չեն օգտագործվում ծրագրի կողմից:
Հիմնական մեթոդները՝
-
Հղումի հաշվիչ (Reference Counting):
- Յուրաքանչյուր օբյեկտ ունի հաշվիչ, որը պահպանում է հղումների քանակը:
- Երբ հղում է ստեղծվում օբյեկտին, հաշվիչը մեծանում է:
- Երբ հղումը անհետանում է (օրինակ, փոփոխականը դուրս է գալիս տեսադաշտից), հաշվիչը նվազում է:
- Երբ հաշվիչը հասնում է զրոյի, օբյեկտը համարվում է հասանելի չէ և նրա հիշողությունը ազատվում է:
- Պրոբլեմներ: Չի կարող մշակել ցիկլային հղումները, երբ երկու կամ ավելի օբյեկտներ հղում են անում միմյանց, բայց դուրս են մնացել ծրագրից:
-
Տրեյսերային գարշահավաք (Tracing Garbage Collector):
- Աշխատում է երկու փուլով՝ նշում (marking) և հավաքում (sweeping) կամ սեղմում (compacting):
- Նշման փուլ: սկսվում է "արմատներից" (root set)՝ օբյեկտներից, որոնք հաստատ հասանելի են (օրինակ՝ գլոբալ փոփոխականներ, ստեկի օբյեկտներ): GC անցնում է բոլոր հասանելի օբյեկտները արմատներից և նշում է նրանց որպես "կենդանի":
- Հավաքման փուլ: GC անցնում է ամբողջ հողատարածքը: Աննշանված օբյեկտները համարվում են "աղբ" և նրանց հիշողությունը ազատվում է:
- Սեղմման փուլ (ընտրովի): Հետո հավաքում GC կարող է տեղափոխել "կենդանի" օբյեկտները՝ մաքրացնելով հիշողության ֆրագմենտացիան:
- Առավելություններ: Կարող է մշակել ցիկլային հղումները:
- Կորուստներ: Կարող է առաջացնել ծրագրի կանգառներ (stop-the-world), երբ GC աշխատում է:
Հաճախ օգտագործվող ալգորիթմներ՝
- Mark-and-Sweep: Նշում է կենդանի օբյեկտները, ապա հավաքում է աղբը:
- Mark-and-Compact: Նշում է կենդանի օբյեկտները, ապա տեղափոխում է նրանց՝ դեֆրագմենտացիայի համար:
- Copying: Կիսում է հողատարածքը երկու կեսի: Երբ GC հավաքում է, այն պատճենում է կենդանի օբյեկտները մեկ կեսից մյուսը, ապա ազատում է սկզբնական կեսը:
- Generational: Հիմնված է այն հիպոթեզի վրա, որ մեծ մասը օբյեկտների մահանում է երիտասարդ տարիքում: Հողատարածքը բաժանվում է սերունդների (օրինակ՝ երիտասարդ և հին): GC հաճախ հավաքում է աղբը երիտասարդ սերնդում, ինչը հանգեցնում է փոքր կանգառների:
Հատուկ մեթոդը՝ կախված օգտագործվող ծրագրավորման լեզվից և իրագործումից: Օրինակ, Java և C# օգտագործում են տարբեր տեսակի տրեյսերային հավաքիչներ, ներառյալ սերունդային։ Python-ը ավանդաբար օգտագործում էր Reference Counting և լրացուցիչ մեխանիզմ ցիկլային հղումները հայտնաբերելու համար, իսկ նոր տարբերակներում նաև կիրառվում են տրեյսերային հավաքման տարրեր։