2011-05-27 21 views
7

Java'da bir uygulamada bellek eksikliğini bildiren herhangi bir teslim özelliği var mı (veya önceden tanımlanmış bir seviyeye ulaştığını bildiren) var mı?Java'da bellek kıtlığı bildirimi

Bir yerde bir dinleyici (veya benzer bir şey) kaydetmenin mümkün olup olmadığını mı merak ediyordum? Runtime sınıfındaki bellek yöntemlerini biliyorum. Kalan hafızayı kontrol etmek için zamanlanmış bir görev oluşturabilirim, ama zaten mevcut bir çözüm olup olmadığını merak ediyorum.

Sanmıyorum, ama bir onay arıyorum. KAYIT

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); 
NotificationEmitter emitter = (NotificationEmitter) mbean; 
NotificationListener listener = new NotificationListener() { 

    @Override 
    public void handleNotification(Notification notif, Object handback) { 

     String notifType = notif.getType(); 
     if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED) || 
      notifType.equals(MemoryNotificationInfo.MEMORY_COLLECTION_THRESHOLD_EXCEEDED)) { 

      // Retrieve the memory notification information 
      CompositeData cd = (CompositeData) notif.getUserData(); 
      MemoryNotificationInfo info = MemoryNotificationInfo.from(cd); 
      MemoryUsage mu = info.getUsage(); 

      System.out.println("Maximum memory = " + mu.getMax()); 
      System.out.println("Used memory = " + mu.getUsed()); 

     } 
    } 

}; 

emitter.addNotificationListener(listener, null, null); 
+0

+1 kodunuzu ilan için! – Andy

+0

@Andy Javadoc'la okumaya gidiyorum. Tam olarak test edilmedi, ama fikir var .... – JVerstry

cevap

5

İÇİN

Sana MemoryMXBean kullanarak bir bellek kullanımı eşiği için bir dinleyici ayarlayabilirsiniz inanıyoruz. Örnek kod javadoc bağlantısında sağlanır.

+1

+1 Atılmış bazı güvenlik önlemleri ile bir "OutOfMemoryError" üzerinde bir 'try'/'catch 'önermek için gidiyordum, ama insanlar her zaman bile söz için bana karmakarışık 'Hata' yakalamak 'sapkınlık'. ;) –

+0

@Andrew Aynı şeyi düşündürmeyi düşünüyordum, ama sonra cevabı @Andy'den gördüm. Bu cevap için +1. – bacchus

+1

@Andrew, OutofMemoryError 'ı yakalamak mümkündür (ve daha önce de yapmıştım), fakat' Error 'işlemek için program akışını kesintiye uğratmak oldukça zordur. – notnoop