Уведомление о нехватке памяти в Java

#java #memory #listener #threshold

#java #память #прослушиватель #пороговое значение

Вопрос:

Есть ли в Java какая-либо поставляемая функция, уведомляющая о нехватке памяти в приложении (или уведомляющая о том, что оно достигло предопределенного уровня)?

Мне было интересно, возможно ли где-нибудь зарегистрировать слушателя (или что-то эквивалентное)? Я знаю о методах памяти в классе Runtime. Я мог бы создать запланированную задачу, проверяющую оставшуюся память самостоятельно, но мне интересно, существует ли уже существующее решение.

Я так не думаю, но я ищу подтверждение.

ДЛЯ ЗАПИСЕЙ

 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);
  

Комментарии:

1. @Andy Это то, к чему я прихожу, читая Javadoc. Не полностью протестировано, но идея есть….

2. Пожалуйста, обратите внимание, что этот код уведомит вас о превышении порога использования памяти… но вам все равно придется установить пороговое значение . Это должно быть сделано для каждого существующего пула памяти.

3. Кроме того, в следующий раз, когда вы найдете возможное решение вашей проблемы, пожалуйста, опубликуйте его в качестве ответа вместо того, чтобы включать код решения в вопрос.

Ответ №1:

Я полагаю, что вы можете настроить прослушиватель для порогового значения использования памяти, используя MemoryMXBean. Пример кода приведен по ссылке javadoc.

Комментарии:

1. 1 Я собирался предложить try / catch на OutOfMemoryError с некоторыми мерами безопасности, но люди всегда ворчат на меня даже за упоминание «ереси» перехвата Error . 😉

2. @Andrew Я думал предложить то же самое, но потом я увидел ответ от @Andy. 1 за этот ответ.

3. @Andrew, это можно перехватить OutofMemoryError (и я делал это раньше), но хорошо обрабатывать Error , не прерывая поток программы, довольно сложно.

4. @notnoop: Моя стратегия заключается в том, чтобы вставлять a JOptionPane после того, как большой byte[] был null отредактирован, так что это определенно «прерывает поток программы» с точки зрения пользовательского ввода!

5. Вы также можете захотеть захватить дамп кучи при выбрасывании OutOfMemoryError . В Hotspot это делает -XX: HeapDumpOnOutOfMemoryError переключатель. Дамп может быть импортирован в VisualVM и поможет вам в дальнейшем анализе проблемы. oracle.com/technetwork/java/javase/memleaks-137499.html#gdyrr