SORU
23 Aralık 2012, Pazar


Jdk1 o HashMaps verildi.6 ve multi ile sorunlara neden yukarıda=, nasıl benim kod hazırlayayım parçacığı

Geçenlerde stackoverflow bir soru, cevabı buldum. İlk soru What mechanisms other than mutexs or garbage collection can slow my multi-threaded java program? oldu

HashMap JDK1 arasında modifed olmuştur benim korku keşfettim.Ve JDK1 6.7. Şimdi tüm iş parçacıklarını eşitleme HashMaps oluşturma neden olan kod bloğu vardır.

JDK1 kod satırı.7.0_10

 /**A randomizing value associated with this instance that is applied to hash code of  keys to make hash collisions harder to find.     */
transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this);

Arama sona erer

 protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier   addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
 }    

Diğer JDKs bakarak, bu JDK1 mevcut değil buluyorum.5.0_22 veya JDK1.6.0_26.

Benim kod üzerinde etkisi büyüktür. 64 iş parçacığı üzerinde çalıştırdığımda, 1 iş parçacığı üzerinde koşarken daha az performans alıyorum bunu yapar. Bir JStack konuları en Rastgele bu döngü içinde iplik zamanlarının çoğunu gösterir.

Bazı seçenekler var gibi:

  • HashMap kullanmıyorum, ama buna benzer bir şey kullanmak için kodu yeniden yazmak
  • Eğer etrafta dağınık bir şekilde rt.jar ve içindeki hashmap değiştirin
  • Sınıf bulaşmak her iş parçacığı HashMap kendi sürümü alır yani bir şekilde yolunu

Bu yollardan herhangi biri (zaman alıcı ve potansiyel olarak yüksek bak çok etkisi) başlamadan önce, eğer bariz bir oyunu özledim merak ettim. Eğer herhangi bir taşma insanlar daha iyi yol olduğu öneririm, ya da belki yeni bir fikir tanımlamak yığını olabilir.

Yardım için teşekkürler

CEVAP
27 Aralık 2012, PERŞEMBE


7u6,#7118743 CR beliren yama orijinal yazarı değilim : Alternatif Karma tabanlı Haritalar ile Dize için Karma.

Sağ hashSeed başlatılması performans sorunu olduğunu ön kabul ediyorum ama tek başına Karma örnek Göster bir kez olur, çünkü bu bir sorun olması bekleniyor. Bu kodu bir darboğaz olmak için saniyede yüzlerce veya binlerce karma haritaları oluşturma olurdu. Bu kesinlikle normal değil. Yokgerçektenuygulama bunu yapmak için geçerli bir sebebi var mı? Ne zamandır bu karma haritalar yaşıyor?

Ne olursa olsun, muhtemelen cambecc önerdiği gibi yerine Rastgele ve tembel başlatma bazı varyant muhtemelen ThreadLocalRandom geçiş araştıracağız.

3 DÜZENLEMEK

Performans sorunu için bir düzeltme JDK7 güncelleme için cıva repo: itilmiş oldu

http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk/rev/b03bbdef3a88

Düzeltme yaklaşan 7u40 sürümünün bir parçası olacak ve zaten İcedTea mevcut 2.4 bültenleri.

7u40 son test yapıları burada mevcuttur yakınlarındaki

https://jdk7.java.net/download.html

Geri bildirim hala karşılandı. 7 ** openJDK geliştiriciler tarafından görüldüğü alır emin olmak için gönderin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009