Как я могу генерировать почтовые оповещения / уведомления, если потребление памяти в jvm превышает некоторые thrsold, с помощью jmx - PullRequest
1 голос
/ 26 апреля 2009

как генерировать почтовые оповещения для следующих изменений в jvm

1) память 2) темы 3) дБ соединения

с помощью jmx

любая помощь будет полезна

спасибо

Ответы [ 2 ]

3 голосов
/ 26 апреля 2009

Я отвечу на ваш вопрос re: memory. Чтобы получать уведомления в любое время, когда указанный пул памяти превышает пороговое значение, выполните что-то вроде ниже. Чтобы получить список всех пулов памяти, вызовите ManagementFactory.getMemoryPoolMXBeans (). Затем выберите те, которые важны для вас. Одна моя машина, список:

Code Cache
Eden Space
Survivor Space
Tenured Gen
Perm Gen
Perm Gen [shared-ro]
Perm Gen [shared-rw]

но я думаю, что умышленно не существует стандартов на это, и они различаются между версиями и реализациями. Итак, сначала получите интересующий вас пул:

MemoryPoolMXBean memPool = ...; // Get a MemoryPoolMXBean

Затем проверьте, разрешен ли порог использования. Если это так, установите один (в байтах)

if(memPool.isUsageThresholdSupported())
{
  memPool.setUsageThreshold(5000000);
}

Затем запросите уведомления при превышении порогового значения, передав NotificationListener в addNotificationListener объекта MemoryMXBean (на самом деле сначала нужно привести его к NotificationEmitter). В этом примере NotificationListener - это анонимный внутренний класс, но он может быть любым, если вы хотите реализовать интерфейс javax.management.NotificationListener. В основном то, что я сделал ниже, - это вывод глупых сообщений в stdout / stderr, в зависимости от того, сколько памяти используется. Конечно, вы можете подключиться к JavaMail или сторонней почтовой инфраструктуре, чтобы вместо этого отправлять почту.

NotificationEmitter memBean = (NotificationEmitter)(ManagementFactory.getMemoryMXBean());
memBean.addNotificationListener(new NotificationListener()
{
  public void handleNotification(Notification n, Object handback)
  {
    CompositeData cd = (CompositeData)n.getUserData();
    MemoryNotificationInfo mni = MemoryNotificationInfo.from(cd);
    MemoryUsage memUsage = mni.getUsage();
    long bytesUsed = memUsage.getUsed();
    if(bytesUsed > 512000000)
      System.err.println("Oh, no, we're using more than 512M!");
    else
      System.out.println("It's okay.  We're only using " + bytesUsed + " bytes.");
  }
}

Что касается потоков, то соответствующим компонентом, очевидно, является ThreadMXBean, который вы получаете из ManagementFactory.getThreadMXBean (). Но не похоже, что есть встроенный способ установить порог или добавить слушателей, поэтому вам придется опросить. Вы можете получить счетчик потоков только из ManagementFactory.getThreadMXBean (). GetAllThreadIds (). Length, и, конечно, в bean-компоненте доступно больше информации.

Наконец, "соединения с БД" просто расплывчаты. Какую систему баз данных вы используете? Является ли рассматриваемая JVM сервером или клиентом и т. Д.

Я рекомендую вам задать новый вопрос, если вам нужна дополнительная информация о последних двух ресурсах.

2 голосов
/ 26 августа 2015

+ 1 для ответа Мэтьюса

Но если кто-то из Java 7.40 + наткнется на это, есть решение, ориентированное на пользовательский интерфейс.

Мы могли бы использовать Java Mission Control (JMC) для генерации этих предупреждений.

JMC теперь упакован в дистрибутив Java, поэтому просто вызовите JMC и подключитесь к удаленному порту JMX (если эта JVM локальная, вы уже должны быть подключены при вызове JMC).

На начальном экране (MBeanServer) вы должны увидеть вкладку «Триггеры» внизу, щелкнув по ней здесь, вы сможете настроить триггеры электронной почты для всех 3 приведенных выше условий - на самом деле вы можете сделать гораздо больше, чем просто отправив электронное письмо. .

...