2011-05-27 58 views
7

Java中是否有任何交付的功能通知應用程序中的內存不足(或通知它已達到預定義級別)?Java中內存不足的通知

我想知道是否可以在某處註冊一個監聽器(或其他類似的東西)?我知道運行時類中的內存方法。我可以自己創建一個計劃任務來檢查剩餘內存,但是我想知道是否已經有一個現有的解決方案。

我不這麼認爲,但我正在尋求確認。

從記錄上

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發佈您的代碼! – Andy 2011-05-28 17:31:16

+0

@Andy這就是我通過Javadoc閱讀的內容。 – JVerstry 2011-05-28 21:18:28

回答

5

我相信你可以設立一個監聽器使用一個MemoryMXBean內存使用率閾值。示例代碼在javadoc鏈接中提供。

+1

+1我正要在一個'OutOfMemoryError'上建議一個'try' /'catch',並且引入了一些安全措施,但是人們總是抱怨我甚至提到捕捉錯誤的'異端'。 ;) – 2011-05-27 22:43:11

+0

@Andrew我正在考慮提出同樣的事情,但後來我看到@Andy的答案。 +1這個答案。 – bacchus 2011-05-27 22:46:59

+1

@Andrew,可以捕捉到'OutofMemoryError'(我之前已經做過),但是在不中斷程序流的情況下很好地處理'Error'是非常困難的。 – notnoop 2011-05-27 22:48:57