2009-02-22 8 views
11

net() impl ben bu gerçekten aptal soru korku, ama burada gider:Java'nın LinkedList

Neden Java'nın varsayılan LinkedList hayata geçirilmesinde önemli yöntem liste yürütmek ve tüm düğümleri unhook rahatsız ediyor? Neden sadece başlığı kaldırmayın ve listenin geri kalanını bırakmayın - GC yine de alacak, değil mi?

/** 
* Removes all of the elements from this list. 
*/ 
public void clear() { 
    Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 
    header.next = header.previous = header; 
    size = 0; 
modCount++; 
} 

Neden yürümek: Burada

yöntemidir? Neden sadece header.next = header.previous = header;'a atlamıyorsunuz?

En iyi Ben GC yardımcı olur ... Bu bağlantı http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 türünün bunu öneriyor.

TIA ...

cevap

18

Bu yöntem diğer kod hala belli düğümlerine referanslar tutan bile, diğer düğümler GC'ed edilmesini sağlar. Aksi takdirde, düğümlerden birine tek bir harici referans bile tüm zincirin toplanmasını engelleyecektir. Ayrıca, listedeki diğer işlemler de aynı anda devam ediyor olabilir (örneğin, subList() veya Collections.unmodifiableList(), yineleyiciler üzerinden görünümler) ve bu, söz konusu öğelerin derhal listeyi "boş" olarak algılamasını sağlar.

+0

Tamamen katılmıyorum, dış kod için bir LinkedList $ Giriş referans almak için bir yol ... ama dolaylı olarak LinkedList $ ListItr aracılığıyla emin olabilirsiniz söylüyorum ... Teşekkürler ve iyi yakalamak! – overthink

+0

Düğüm ne tutuyordu? Bir yineleyici veya alt liste, ama bunlar geçerli olmayacak, bu yüzden geçerli olmayacaktır. –

+0

@ Tom: Bunu yapmadıysanız, altList ve Yineleyici çalışmaya devam edecektir, ancak toplama çerçevesi başarısız olmaya çalışır (ancak bunu garanti etmez). –

2

IIRC, bu, belirli (kuşak) GC algoritmalarının performansına yardımcı olmak için JDK6'da yapılan bir değişiklikti. Çoğu zaman, List'un kendisi ve eski düğümler, diğer düğümlerden bazılarına göre daha eski bir jenerasyonda olacaktır. Genç nesiller daha sık toplanacaktır, bunun sonucu olarak genç düğümler tüm düğümlerin çöp olduğu keşfedilmeden önce kopyalanacaktır.

Bu, küçük bir performans optimizasyonu. Bellek performansı en iyi duruma getirme işlemi biraz gariptir, çünkü genellikle yürütmek için ek süreyi alan soruna neden olan kod değildir.

0

Sadece oyun geliştirme blogumda bu konu üzerinde spekülasyon yapıyordum. Cevap için teşekkürler. Düğüm maruziyetinin şüpheli bir tasarım ödeneği olduğunu iddia ediyorum. Ayrıca, liste üzerindeki alternatif görünümlerin (yineleyiciler ve benzerleri) başarısızlık hızının kaldırılmasıyla ilgili düğümlere güveneceği de taslaktır. Bu yan etki davranışına güvenmek yerine, listedeki alt görüşler, değişiklik sayısını kontrol etmelidir. Her halükarda, neden şimdi onunla kaldıklarını anlıyorum.

0

http://developer.classpath.org/doc/java/util/LinkedList-source.html adresindeki java.util.LinkedList kaynak kodu, ilk ve son öğeleri null olarak atayabileceğinizi önerir.

Elbette, aşırı koruyucu olmaya eğilimliyseniz, her şeyden geçebilirsiniz. Listenizde binlerce elemanın bulunması halinde bunun çok pahalı bir görev olabileceğini düşünüyorum.

İlgili konular