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

  • Ampisound

    Ampisound

    12 Kasım 2006
  • TouchePro

    TouchePro

    27 EYLÜL 2007
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005