Sobes.tech
Junior — Middle

Жады басқару алгоритмдерінде объектілерді іздеу кезінде автоматты қоқыс жинау қалай жүзеге асырылады?

sobes.tech AI

AI-дан жауап

Java сияқты тілдерде автоматты қоқыс жинау (Garbage Collection, GC) объектілерге арналған жадыны тауып, босататын алгоритмдер арқылы жүзеге асырылады, олар енді сілтемелері жоқ.

Негізгі идея — түпкі көздерден (root set), мысалы, жергілікті айнымалылар, статикалық өрістер және т.б., қол жетімді объектілерді іздеу. Барлық сілтемелер арқылы жетуге болатын объектілер тірі деп саналады. Қалғандары — қоқыс және олар жойылуы мүмкін.

Алгоритмнің мысалы — графтың тереңдік немесе енін обход, түпкі көздерден бастау арқылы тірі объектілерді белгілеу. Содан кейін белгісіз объектілердің жадысы босатылады.

Java-да жиі қолданылатын — ұрпақтық жинағыш, ол объектілерді ұрпақтарға бөледі (жас, ескі) және жинауды оңтайландырады, себебі көп объектілер тез қоқысқа айналады.

Тірі объектілерді іздеу үшін қарапайым псевдокод мысалы:

void markReachableObjects(Set<Object> roots) {
    Set<Object> reachable = new HashSet<>();
    Deque<Object> stack = new ArrayDeque<>(roots);
    while (!stack.isEmpty()) {
        Object obj = stack.pop();
        if (!reachable.contains(obj)) {
            reachable.add(obj);
            for (Object ref : obj.getReferences()) {
                stack.push(ref);
            }
        }
    }
    // reachable-те жоқ барлық объектілер — қоқыс
}