OpenJDK的LinkedBlockingQueue实现(在java.util.concurrent中)对Node类的结构感到有些困惑。
我已经复制了以下节点类的描述:
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”)。
这似乎与出队方法直接相关,如下所示:
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; }
因此,我们删除了当前标题,并将其下一个设置为“ help GC”。
这对GC有何帮助?对GC有多大帮助?
我问了代码作者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