Sobes.tech
Middle+

Խոսեք աղբահանության հավաքողի (Garbage Collector) աշխատանքի մեթոդների մասին։

sobes.tech AI

Պատասխան AI-ից

Ջամփագծողը ավտոմատ կառավարման գործընթաց է հիշողության, որը ազատում է այն հիշողությունը, որը զբաղեցրած է օբյեկտներով, որոնք այլևս չեն օգտագործվում ծրագրի կողմից:

Հիմնական մեթոդները՝

  1. Հղումի հաշվիչ (Reference Counting):

    • Յուրաքանչյուր օբյեկտ ունի հաշվիչ, որը պահպանում է հղումների քանակը:
    • Երբ հղում է ստեղծվում օբյեկտին, հաշվիչը մեծանում է:
    • Երբ հղումը անհետանում է (օրինակ, փոփոխականը դուրս է գալիս տեսադաշտից), հաշվիչը նվազում է:
    • Երբ հաշվիչը հասնում է զրոյի, օբյեկտը համարվում է հասանելի չէ և նրա հիշողությունը ազատվում է:
    • Պրոբլեմներ: Չի կարող մշակել ցիկլային հղումները, երբ երկու կամ ավելի օբյեկտներ հղում են անում միմյանց, բայց դուրս են մնացել ծրագրից:
  2. Տրեյսերային գարշահավաք (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 և լրացուցիչ մեխանիզմ ցիկլային հղումները հայտնաբերելու համար, իսկ նոր տարբերակներում նաև կիրառվում են տրեյսերային հավաքման տարրեր։