Sobes.tech
Middle+

Խոսիր Go լեզվի աղբահանության հավաքողի մասին։

sobes.tech AI

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

Go օգտագործում է պառլելային, երեքգույն, ոչ կոմպակտագնող աղբահավաքիչ, որը ունի ցածր ուշացում:

Հիմնական աշխատանքային սկզբունքները:

  • Նշում (Mark): Կարգավորում է, թե որոնք օբյեկտները հասանելի են ռուտային ցուցիչներից (ռեգիստրներ, գորուտների stack-ներ, գլոբալ փոփոխականներ): Օգտագործվում է երեքգույն ալգորիթմ (սպիտակ - չայցելված, գորշ - այցելված, բայց ժառանգները դեռ չստուգված, սև - այցելված և բոլոր ժառանգները ստուգված):
  • Աղբահավաք (Sweep): Հեռացնում է հասանելի olmayan օբյեկտները (մնում են սպիտակ) և ազատում հիշողությունը կրկնակի օգտագործման համար:

Նշված առանձնահատկությունները:

  • Պառլելային: Նշումը կատարվում է օգտվողի կոդի կատարման հետ միասին (STW - Stop-The-World փուլերը շատ կարճ են):
  • Նվազեցված ուշացում: Դիզայն է, որպեսզի նվազեցնի ընդհատումները ծրագրի աշխատանքի ժամանակ:
  • Ոչ կոմպակտ: Չփոխում է կենդանի օբյեկտները հիշողության մեջ, ինչը կարող է հանգեցնել ֆրագմենտացիայի, բայց պարզեցնում է իրականացմանը և արագացնում նշումը/աղբահավաքը:

Աշխատանքային փուլերը:

  1. Նշում օգնական: Օգտվողի գորուտինները օգնում են հավաքիչին նշման փուլում հիշողության բաժանման ժամանակ:
  2. Նշում: Պառլելային նշում հասանելի օբյեկտների:
  3. Նշման ավարտ: Կարճ STW փուլ՝ նշման ավարտին հասցնելու համար:
  4. Աղբահավաք: Պառլելային անջատում հասանելի olmayan օբյեկտների:

Կառավարում:

  • Ավտոմատ:
  • Աղբահավաքի շեմերը կարգավորվում են GOGC շրջակա միջավայրի փոփոխության միջոցով: Դեպի նախնական արժեքը GOGC=100, ինչը նշանակում է, որ հավաքումը կսկսվի, երբ հողակտորն աճի նախորդ ցիկլի համեմատ:
  • runtime.GC() ֆունկցիան ուժեղացնում է հավաքումը, բայց դրա օգտագործումը խորհուրդ չի տրվում ստանդարտ կոդում:
package main

import (
	"runtime"
	"time"
)

func main() {
	// Օրինակ՝ ուժեղացված GC կանչ
	runtime.GC()

	// Օրինակ՝ ստացեք GC վիճակագրությունը
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Ընդհանուր հիշողության տրամադրվածություն: %v բայթ\n", memStats.TotalAlloc)
}

Առավելությունները:

  • Ավտոմատ հիշողության կառավարում, նվազեցնում է սխալների հավանականությունը (հիշողության արտահոսք, կրկնակի ազատում):
  • Դիզայն է՝ մրցակցային կատարման համար:

Անբավարարությունները:

  • Անորոշ ժամանակով աշխատող GC:
  • Հնարավոր է հիշողության սպառման ավելացում՝ ձեռքով կառավարման համեմատ: