#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