Реализация LinkedBlockingQueue OpenJDK: класс узла и GC


Меня немного смущает структура класса Node в реализации Linkedblockingqueue в OpenJDK (в java.утиль.параллельный).

Я воспроизвел описание класса узлов ниже:

static class Node<E> {
    E item;

    /**
     * One of:
     * - the real successor Node
     * - this Node, meaning the successor is head.next
     * - null, meaning there is no successor (this is the last node)
     */
    Node<E> next;

    Node(E x) { item = x; }
}

В частности, я запутался на 2-м выборе для next ("этот узел, то есть преемник-голова.следующий").

Это, по-видимому, напрямую связано с методом dequeue, который выглядит следующим образом:

private E dequeue() {
    // assert takeLock.isHeldByCurrentThread();
    // assert head.item == null;
    Node<E> h = head;
    Node<E> first = h.next;
    h.next = h; // help GC
    head = first;
    E x = first.item;
    first.item = null;
    return x;
}

Итак, мы удалили текущую головку и устанавливаем ее следующую быть самому себе, чтобы "помочь ГК".

Как это помогает GC? Насколько это полезно для GC?

1 2

1 ответ:

Я спросил профессора Дуга Леа, автора кода, и он сказал, что это уменьшает шансы ГК оставить плавучий мусор.

Некоторые полезные ресурсы по плавающему мусору:

Http://www.memorymanagement.org/glossary/f.html#floating.garbage

Http://java.sun.com/docs/hotspot/gc1.4.2/#4.4.4.%20Floating%20Garbage/outline

Http://blog.johantibell.com/2010/04/generational-garbage-collection-and.html