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:
java.lang.OutOfMemoryError
iyi bir fikir olabilir yakalamak zaman gerçek bir kelime senaryoları var mı?- 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
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.
İle " uğraşan;java.lang.OutOfMemor...
Hata java.lang.OutOfMemoryError: GC ov...
Nasıl başa "java.lang.OutOfMemory...
java.lang.OutOfMemoryError: GC overhea...
java.lang.OutOfMemoryError: VM bütçemi...