SORU
30 NİSAN 2011, CUMARTESİ


java.lang.OutOfMemoryError: GC overhead limit aşıldı

(15-20) birkaç metin girdileri her ile çok sayıda (yüzlerce, binlerce) HashMap nesneleri oluşturan bir programda bu hatayı alıyorum. Bu Dizeler tüm toplanan (küçük miktarlar halinde kırılma olmadan) bir veritabanına gönderilmeden önce olmak zorunda.

Göre Güneş, hata olur "eğer çok fazla zaman harcanan çöp toplama: daha fazla ˜ toplam süre harcanan çöp toplama ve daha az 2% yığın kurtarıldı, bir OutOfMemoryError olacak atılır.".

Görünüşe göre, bir komut satırı için JVM argümanları geçmek için kullanabilir

  • Yığın boyutunu artırarak, ile "-Xmx1024m" (veya daha fazla), ya da
  • Hata tamamen kontrol devre dışı bırakılması, ile "-XX:-UseGCOverheadLimit".

İlk yaklaşım iyi çalışır, ikinci bir java kadar biter.lang.OutOfMemoryError, bu sefer öbek hakkında.

Yani, soru şu: böyle bir program alternatiftir, özellikle kullanma durumu (yani, birkaç küçük HashMap nesneler) için? Eğer HashMap açık kullanırsam() yöntemi, örneğin, sorun uzağa gider, ancak veri HashMap içinde saklı öyle! :-)

Another discussion in StackOverflow about this problem

CEVAP
30 NİSAN 2011, CUMARTESİ


Aslında bellek işlemi sorunsuz çalıştırmak için çalışan sensin. Akla gelen seçenekler:

  1. Daha fazla bellek bahsettiğiniz gibi, -Xmx512m gibi arasında bir şeyler denemek belirtin
  2. HashMap mümkünse aynı anda işlemek için nesneler daha küçük gruplar ile çalışmak
  3. Eğer yinelenen dizeleri bir sürü varsa, HashMap içine koyarak önce onları String.intern() kullanın
  4. Dava için ayarlamak için HashMap(int initialCapacity, float loadFactor) oluşturucu kullanın

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BSA

    BSA

    9 NİSAN 2012
  • pain975

    pain975

    27 NİSAN 2008
  • POGProductionz

    POGProductio

    27 NİSAN 2012