我对OpenJDK的LinkedBlockingQueue实现中的Node类结构感到有点困惑(在java.util.concurrent中)。
我已经复制了以下节点类的描述:
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; }
}
具体来说,我对下一个选择感到困惑(“这个节点,意思是后继者是head.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有何帮助? GC对它有多大帮助?
答案 0 :(得分:1)
我问过代码的作者Doug Lea教授,他说它减少了 GC离开浮动垃圾的可能性。
浮动垃圾的一些有用资源:
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