SORU
20 NİSAN 2010, Salı


Java yakalamak.lang.OutOfMemoryError?

java.lang.Error Documentation diyor ki:

Bir Hata makul bir uygulama yakalamak için denemek gerektiğini ciddi sorunlar yaşandığını belirten Throwable sınıfıdır

Ama java.lang.Error java.lang.Throwable, bir alt sınıf gibi Throwable bu tür yakalayabilirim.

Durum bu tür yakalamak için iyi bir fikir değil anlıyorum. Eğer onu yakalamak için karar verirsek anladığım kadarıyla, catch işleyicisi kendisi tarafından herhangi bir bellek ayrılamadı. Aksi takdirde OutOfMemoryError tekrar atılır.

Peki, sorum şu:

  1. java.lang.OutOfMemoryError iyi bir fikir olabilir yakalamak zaman gerçek bir kelime senaryoları var mı?
  2. Eğer java.lang.OutOfMemoryError, Nasıl catch işleyicisi kendisi tarafından herhangi bir bellek (araçlar ya da en iyi uygulamaları) tahsis olmadığından emin miyiz? yakalamaya karar verirsek

CEVAP
21 NİSAN 2010, ÇARŞAMBA


Ve en yanıtları burada katılıyorum katılmıyorum.

Bir OutOfMemoryError yakalamak için isteyebilirsiniz senaryoları bir dizi var ve benim durumumda (Windows ve Solaris Jvm'ler üzerinde), çok seyrek bir JVM için ölüm Çanı, OutOfMemoryError.

Orada sadece iyi bir neden için yakalamak bir OutOfMemoryError ve yakın aşağı incelikle, temiz bir şekilde serbest kaynakları ve günlük başarısızlık nedenini en iyi siz yapabilirsiniz (hala mümkün).

Genel olarak, OutOfMemoryError öbek kalan kaynaklar ile karşılanan blok bellek ayırma nedeniyle oluşur.

Ne zaman Hata atılır yığın içerir, aynı miktarda tahsis edilen nesneler olarak önce başarısız ayırma ve zamanı bırak referanslar için çalışma zamanı nesneleri için ücretsiz Daha fazla bellek gerekli olabilecek için temizleme. Bu durumda bile devam etmek mümkün olabilir ama bu kesinlikle hiç JVM zararı bir durumda olduğundan 0 emin olabilirsin kötü bir fikir olurdu.

OutOfMemoryError bu gösteri JVM catch bloğu bellek yetersiz olduğu anlamına gelmez:

private static final int MEGABYTE = (1024*1024);
public static void runOutOfMemory() {
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    for (int i=1; i <= 100; i  ) {
        try {
            byte[] bytes = new byte[MEGABYTE*500];
        } catch (Exception e) {
            e.printStackTrace();
        } catch (OutOfMemoryError e) {
            MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
            long maxMemory = heapUsage.getMax() / MEGABYTE;
            long usedMemory = heapUsage.getUsed() / MEGABYTE;
            System.out.println(i  " : Memory Use :"   usedMemory   "M/"   maxMemory   "M");
        }
    }
}

Bu kodun çıktısı:

1 : Memory Use :0M/247M
..
..
..
98 : Memory Use :0M/247M
99 : Memory Use :0M/247M
100 : Memory Use :0M/247M

Eğer kritik bir şey çalışıyorsa, ben genellikle, Hata yakalamak, syserr log, seçim günlüğü benim çerçeve kullanarak, kaynakları serbest bırakmak ve temiz bir şekilde kapatmaya devam edin oturum açın. Başına gelebilecek en kötü şey nedir? JVM ölüyor (ya da çoktan ölmüş zaten ve Hata alıcı tarafından oraya temizleme en azından bir şans.

Uyarı temizleme mümkün olduğu tek yerde bu tür hatalar alıcı hedef olması. Battaniye catch(Throwable t) {} yok her yerde ya da böyle saçma.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • engineerguy

    engineerguy

    10 Ocak 2010
  • Skrillex

    Skrillex

    6 NİSAN 2010