Sobes.tech
Middle+

Go тилинде топтоо кандай түзүлгөн?

sobes.tech AI

AIден жооп

Golangда, heap — бул эс тутумдун бир бөлүгү, анда динамикалык бөлүнгөн объекттер жайгаштырылат. Бул эс тутумдун башкарылышы автоматтык түрдө чогулткуч (garbage collector) аркылуу жүргүзүлөт:

Негизги аспектилер:

  • Динамикалык бөлүү: Кичинекей өлчөмдөгү жана кыска мөөнөттүү жашоосу бар объекттер, алардын жашоо мөөнөтү функциянын же стектин чегинен чектелгенин далилдей албаган, же new же & аркылуу алынган объекттер, адатта, heapке жайгаштырылат.
  • Чогулткуч (GC): Go параллелдүү, үч түстүү, Mark-and-Sweep чогулткучун колдонуп, программаны иштетип жатканда иштейт, паузаларды минималдаштырып.
    • Mark (Белги): GC жеткиликтүү объекттерди тамыр көрсөтүүчүлөрдөн (локалдык өзгөрмөлөр стекте, глобалдык өзгөрмөлөр) өтүп, "өлү" деп белгилейт.
    • Sweep (Тазалоо): GC бардык жеткиликтүү heapти карап чыгып, белгиленбеген объекттерди бошотот.
    • Параллелдүү: GC өзүнчө goroutineдерде иштейт, негизги программадагы кечигүүлөрдү азайтат.
  • Escape Analysis: Golang компилятору анализ жүргүзөт (escape analysis), өзгөрмө же мааниге кайсы жерден көрсөтүлүп жатканын аныктоо үчүн — стекке же heapке. Эгер өзгөрмө же структуралык талаа учурдагы goroutineдан кийин жеткиликтүү болсо, ал көбүнчө heapке бөлүнөт. Башкача болсо, стекке.
    // Escape analysis мисалы:
    // Бул объект, көбүнчө, heapке бөлүнөт,
    // анткени көрсөткүч кайтарат.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // көрсөткүч "бегет" функциядан
    }
    
    // Бул объект, көбүнчө, стекке бөлүнөт,
    // анткени ал функция аяктагандан кийин жеткиликтүү эмес.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Ареналарга бөлүү (Arenas): Golangда heap бир нече ареналарга бөлүнүшү мүмкүн, бул чогулткучтун эффективдүүлүгүн жогорулатат, өзгөчө көппроцессордук системелерде.
  • mmap колдонуу: Golang системдик чакырык mmap аркылуу чоң виртуалдык эс тутум блокторун бөлүштүрөт.
  • Үзгүлтүксүздүк: Кээ бир тилдерге караганда, Go физикалык үзгүлтүксүз объекттерди кепилдик бербейт. Эс тутум бөлүк-бөлүк болушу мүмкүн.
  • Кол менен башкаруунун жоктугу: Программист эс тутумду так бөлүп же бошотушу керек эмес, GC автоматтык түрдө жасайт.

Stack жана heap Golangда ар башка ролдорду аткарат:

Эс тутумдун бөлүгү Максаты Башкаруу Өмүрү
Stack Жергиликтүү өзгөрмөлөр, функция параметрлери, кайтаруу даректери Автоматтык (функцияга кирүү/чыгуу учурунда) Функциянын иштөө мөөнөтү менен чектелген
Heap Динамикалык бөлүнгөн объекттер, "бегип кеткен", чоң структуралар Чогулткуч (GC) Достап болуу аркылуу аныкталат